微软信仰中心 2017-12-23
最近开始自己动手写一个财务分析软件,由于自己也是刚学.Net不久,所以自己写的的时候遇到了很多问题,希望通过博客把一些印象深刻的问题记录下来。
1.问题引入
在开发中用到了ComboBox控件,也就是实现下拉选择功能的控件。但是选项的 数据并不是固定的,而是要根据数据库中的某一列进行动态的调整。
2.解决思路
这里我大概考虑了两种情况,一种是下拉列表的选择项是项目中的实体类某一属性,或者项目其他要用到该属性对应的数据库主键。
这种情况主要是把实体对象通过SqlDataReader方法读取并封装到集合中,然后再绑定数据。
而我这里的情况是只需要显示对应的属性就好,使用的是SqlDataAdapter方法读取数据 ,然后在控件所在窗体初始化的时候把数据绑定。
3.参考代码
第一种情况:
SQLHelper类中的代码:
public static SqlDataReader GetReader(string sql) { SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand(sql, conn); try { conn.Open(); return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { conn.Close(); //将错误信息写入日志... throw ex; } }
封装到集合中:
public List<StudentClass> GetAllClasses() { string sql = "select ClassName,ClassId from StudentClass"; SqlDataReader objReader = SQLHelper.GetReader(sql); List<StudentClass> list = new List<StudentClass>(); while (objReader.Read()) { list.Add(new StudentClass() { ClassId = Convert.ToInt32(objReader["ClassId"]), ClassName = objReader["ClassName"].ToString() }); } objReader.Close(); return list; }
然后在窗体初始化方法里面调用并绑定数据:
private StudentClassService objClassService = new StudentClassService(); public FrmAddStudent() { InitializeComponent(); //初始化班级下拉框 this.cboClassName.DataSource = objClassService.GetAllClasses(); this.cboClassName.DisplayMember = "ClassName"; this.cboClassName.ValueMember = "ClassId"; }
第二种情况:
SQLHelper类中的代码:
public static DataSet GetDataSet(string sql) { SqlConnection conn = new SqlConnection(connString); //SqlCommand cmd = new SqlCommand(sql, conn); SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataSet ds = new DataSet(); da.Fill(ds); return ds; }
然后在窗体初始化方法里面调用并绑定数据:
1 public partial class FrmVoucherQuery : Form 2 { 3 public FrmVoucherQuery() 4 { 5 InitializeComponent(); 6 string sql = string.Format("Select FName From t_VoucherGroup Order by FGroupID"); 7 //控件名.DataSource=数据集.数据表 8 cbVoucherName.DataSource = SQLHelper.GetDataSet(sql).Tables[0]; 9 cbVoucherName.DisplayMember = "FName"; 10 cbVoucherName.ValueMember = "FName"; 11 } 12 }