1 列/单元格类型揭密(column/cell types)
DataGridView控件提供了几种列类型用以显示数据,并允许用户修改和添加数据。
当你对DataGridView进行了绑定,并将它的AutoGenerateColumns属性设置为true,它会根据数据源中列的数据类型自动生成列,这些列都使用相应的默认类型(与数据源列数据类型相适应)。
你也可以自行创建列的实例,将它们加入DataGridView的Columns集合中,这些列可用作非绑定列,也可以以手动方式让它们用于绑定数据。手动绑定的列非常有用,比如,自动生成的列都采用与数据源的列相应的默认类型,而你不想用默认列类型。
下表描述了DataGridView 的各种列对应的类:
列类型 |
描述 |
DataGridViewTextBoxColumn |
用于基于文本的值。绑定到数字和字符串值时会自动生成这种类型的列。 |
DataGridViewCheckBoxColumn |
用于显示Boolean和CheckState类型的值,绑定到上述类型值时会自动生成这种类型的列。 |
DataGridViewImageColumn |
用于显示图像。绑定到byte数组,Image对象,图标对象时会自动生成这种类型的列。 |
DataGridViewButtonColumn |
用于在单元格内显示按钮。在绑定时不会自动生成,一般用于非绑定列。 |
DataGridViewComboBoxColumn |
用于在单元格内显示下拉列表。在绑定时不会自动生成,一般地需要手工绑定。 |
DataGridViewLinkColumn |
用于在单元格内显示链接。在绑定时不会自动生成,一般地需要手工绑定。 |
自定义列类型 |
通过继承DataGridViewColumn 类或其子类,你可以创建自己的列类型,以提供自定义的外观、行为和宿主控件。 |
常见问题(FAQ)
1) 如何隐藏一列?
1.1 DataGridViewTextBoxColumn
DataGridViewTextBoxColumn是一种通用的列类型,用于表示基于文本的值,比如数字和字符串。在编辑模式下,会有一个TextBox控件出现在当前活动单元格,用户可以修改单元格的值。
单元格的值在显示时会自动转换为字符串。用户输入或修改的值在提交时则被自动解析为合适的数据类型以创建一个单元格的值。通过处理CellFoamatting和CellParsing事件,你可以自定义这些转换的方式。比如将数据源的日期字段以特定的形式显示,对某些特殊单元格作出特殊的标记。
对一列来说,它包含的单元格值的数据类型由该列的ValueType属性指定。
1.1.1 常见问题
2) Why does the cell text show up with “square” characters where they should be new lines?
1.2 DataGridViewCheckBoxColumn
DataGridViewCheckBoxColumn用于显示Boolean或CheckState类型的值。Boolean 值显示为二元(two-state)或三元 (three-state) 的CheckBox,而这取决于该列的ThreeState 属性的值。如果该类型的列绑定到CheckState类型的值,ThreeState属性的默认值为true。
一般情况下,CheckBox类型的单元格要么用于存储数据,就像其它类型的数据一样,要么用于进行一些重要操作。用户点击CheckBox单元格时,如果你希望对此立即做出反应,可以处理CellClick事件,但该事件发生在单元格的值更新之前。如果点击之时就希望获得新值,一种选择是根据当前值计算点击后的值;另一种方法是立即提交值的变化,然后在CellValueChanged事件处理函数中对此作出反应,而要在用户点击单元格时立即提交值的变化,你必须处理CurrentCellDirtyStateChanged事件,在这里,调用CommitEnd方法提交新值。
1.3 DataGridViewImageColumn
DataGridViewImageColumn 类型的列用于显示图像。这种类型的列有三种方法生成:绑定到数据源时自动生成;为非绑定列手动生成;在CellFormatting事件处理函数(该事件发生在单元格显示前)中动态生成。
绑定到数据源时自动生成Image列的方法适用于大量的图像格式,包括.NET中Image类支持的各种格式,还有Access数据库及Northwind范例数据库使用的OLE图片格式。
如果你想提供DataGridViewButtonColumn列的功能,又希望显示自定义的外观,手动生成Image列会很有用。在显示后,你可以处理CellClick事件以处理用户对单元格的点击(模拟按钮列)。
如果你要为计算值或非图片的值提供图片显示,在CellFormatting事件处理函数中动态生成Image列的方法会很有用。比如,你有一个表示风险值的列,它的值可能是”high”、”middle”或”low”,可以为它们显示不同的图标作为警示;或者你有一个名为”Image”的列,它的值时图片文件的位置而不是真实的图片内容,也可以用这种方法。
1.3.1 常见问题
1) 如何使Image列不显示任何图像(字段值为null时)?
1.4 DataGridViewButtonColumn
使用DataGridViewButtonColumn 列,可以在单元格内显示按钮。如果你要为用户操作特定行提供一种简单的方式,Button列会很有用,比如排序或在另一个窗体中显示子表记录。
在对DataGridView进行数据绑定时不会自动生成Button列,所以你必须手动创建它们,然后把它们添加到DataGridView控件的Columns集合中。
你可以处理CellClick事件以响应用户的点击动作。
1.5 DataGridViewComboBoxColumn
在DataGridViewComboBoxColumn类型的列中,你可以显示包含下拉列表的单元格。这在仅允许用户输入一些特定值的时候显得很有用,比如在SQL Server示例数据库Northwind中Products表的Category列,它表示产品的种类,这个应只允许选择现有的产品种类,此时就可以使用ComboBox列。
如果你了解如何为ComboBox控件生成下拉列表,就可以用相同的方式为ComboBox列中的所有单元格生成下拉列表。要么通过列的Items集合手动添加,要么通过DataSource,DisplayMember 和ValueMember属性绑定到一个数据源。要了解其中的更多信息,可以参考WinForms中ComboBox空间的用法。
你可以将ComboBox列的单元格的实际值绑定到DataGridView控件本身的数据源(注意不是ComboBox列的数据源),这需要设置该列的DataPropertyName属性(设置某个列的名称)。
ComboBox列不会在数据绑定时自动生成,所以你必须手动创建它们,然后将其添加到Columns集合属性中。另外,你也可以使用设计器,在设计时设置相应的属性,这个过程类似于在设计器中ComboBox控件的使用。
1.5.1 DataError事件和ComboBox列
在使用DataGridViewComboBoxColumn 时,有时会修改单元格的值或启动ComboBox控件的Items集合,这样可能会引发DataError事件。这是ComboBox列的设计使然,ComboBox列的单元格会进行数据验证。在ComboBox列的单元格尝试绘制包含的内容时,它需要将包含的值进行格式化(见第二章第三节),在此转换过程中,它会在ComboBox的Items集合中查找对应的值,如果查找失败,就会引发DataError事件。忽略了DataError事件可能会使单元格不能进行正确的格式化。
1.5.2 常见问题
2) How do I handle the SelectedIndexChanged event?
1.6 DataGridViewLinkColumn
使用DataGridViewLinkColumn列,你可以显示一列包含超链接的单元格。在显示数据源中的URL值,或者替代按钮列进行一些特殊行为,如打开另一个子记录窗体时会很有用。
Link列也不会在DataGridView数据绑定时自动生成。要使用它,你还得手动创建,然后将它添加到DataGridView控件的Columns集合中。
你可以处理CellContentClick事件来相应用户的点击动作。这个事件不同于CellClick 和CellMouseClick 事件,后两者在用户点击单元格任何位置(而不仅仅时链接)时都会触发。
DataGridViewLinkColumn 类提供了几个属性,用来修改链接的外观,包括点击前,点击时和点击后(类似于网页中的超链接)。