很多时候我们都需要使用DataGridView来做数据的显示,DataGridView是一个很方便的工具,他可以让用户直接在控件里面做数据的修改,还可以实现单表的更新,操作起来很方便。但是如果用户在做一些操作的时候可以随意输入自己想输入的值,那就有可能和数据中建立的约束不匹配,造成数据操作异常。所以我们经常会考虑尽量不让用户一定数量做输入操作,也就是说宁愿让其选择也不让其输入,这样又可以减少很多的判断也可以增加操作的成功性,提高用户体验的舒适度。这就必然需要去考虑到如果在DataGridView里面显示类似下拉列表的效果。我们知道,在DataGridView控件的列类型里面有一个DataGridViewComboBoxColumn,它的效果就类似于我们常用的comboBox了。只不守它是在控件之中的,所以在绑定的时候需要做一些设置。下面就以两个实例来说明如果绑定数据。
首先我们来做一个简单的绑定性别的实例,效果是这样:
这里,管理员可以修改用户的性别,但是如果让其输入不仅麻烦而且还容易出错,造成数据更新错误。它的实现方法也很简单。将DataGridView中需要显示为下拉列表的列修改类型为DataGridViewComboBoxColumn,然后为其Items设置相应的项,如男 女,这样在常规的数据绑定后就会显示出上图的效果了!
但是,我们知道,在数据库里面性别一般会有三种类型,int,bit,char(2),如果这里的性别类型在数据库里面是前面两种,那么很有可能出现绑定异常:
这是因为这种类型的绑定只能绑定字符串,如果是数值,那就不行了!当然,在控件里面设置的ITEMS项的值也应该和数据库里面的值 完全对应才可以。
上面的方法可以实现一般性的绑定需要,但是只适合项值固定的情况,如性别只可能是男和女,不可能是其它的值。但是如果显示的值是动态的那刚刚这个方法显然是不行的,因为你不可能因为每一次的添加或者删除而修改源文件再重新生成一个项目吧。所以最好的方式是将这个DataGridViewComboBoxColumn做 到类似单独的comboBox的数据绑定效果:
string sql = "select subjectid,subjectname from subject";
da = new SqlDataAdapter(sql, DBHelper.connection);
da.Fill(ds, "subject");
this.cboSubject.DataSource = ds.Tables["subject"];
this.cboSubject.DisplayMember = "subjectname";
this.cboSubject.ValueMember = "subjectid";
this.cboSubject.SelectedIndex = 0;
不管数据库如何变化,都是显示数据库的最新更新的值,如下图 :
为了做到这个我们需要做以下修改:
常规的DataGridView数据绑定还是一样,如:
1. DataSet ds = new DataSet();
SqlDataAdapter da;
2. sql = string.Format("select studentname,subjectid,studentresult,examdate from student inner join result on student.studentno=result.studentno where student.studentno='{0}'",studentNo);
3. da.SelectCommand.CommandText = sql;
4. da.Fill(ds,"student");
5. this.dgvStudentScore.DataSource=ds.Tables["student"];
为了使DataGridView中的列做到类似comboBox的绑定方式,我们先修改DataGridView列的发生由DataGridViewTextBoxColumn到DataGridViewComboBoxColumn,之后我们添加了以下代码:
1. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).DataSource=ds.Tables["subject"];
2. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).DisplayMember = "subjectname";
3. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).ValueMember = "subjectid";
这里,dgvStudentScore是DataGridView控件名,subjectid是控件里面需要动态绑定数据的列,DataGridViewComboBoxColumn是指这个列的类型需要强制做一个转换,不能它还不是一个真正的ComboBox,也就不能做下拉数据的绑定了。
从上面这个方式可以看到,他的绑定和下拉列表很像,只是需要去获取到需要做动态绑定的列同时做一个类型转换就可以了。
上面还有一个细节就是:在SQL里面只需要读取到相应的ID值(subjectid),同时在控件里面设置列的数据绑定的时候也需要将DataPropertyName值设置为subjectid。