DataGridView使用方法汇总

简介:

DataGridView控件

DataGridView是用于Windows Froms 2.0的新网格控件。它能够代替先前版本号中DataGrid控件,它易于使用并高度可定制,支持许多我们的用户须要的特性。

关于本文档:

本文档不准备面面俱到地介绍DataGridView,而是着眼于深入地介绍一些技术点的高级特性。

本文档按逻辑分为5个章节,首先是结构和特性的概览,其次是内置的列/单元格类型的介绍,再次是数据操作相关的内容,然后是主要特性的综述,最后是最佳实践。

大部分章节含有一个“Q & A”部分,来回答该章节相关的一些常见问题。注意,某些问题会因为知识点的关联性反复出如今多个章节。这些问题、答案及其附带的演示例子代码都包含在本文档的附录部分。

内容

1 何为DataGridView.. 4

1.1 DataGridView和DataGrid 之间的差别... 4

1.2 DataGridView的亮点... 5

2 DataGridView的结构... 6

2.1 结构元素... 6

2.2 单元格和组... 6

2.3 DataGridView的单元格... 6

2.3.1 DataGridViewCell的工作机制... 7

2.4 DataGridView的列... 9

2.5 DataGridView的编辑控件... 9

2.6 DataGridView的行... 10

3 列/单元格类型揭密... 11

3.1 DataGridViewTextBoxColumn. 11

3.2 DataGridViewCheckBoxColumn. 12

3.3 DataGridViewImageColumn. 12

3.4 DataGridViewButtonColumn. 13

3.5 DataGridViewComboBoxColumn. 13

3.5.1 DataError与ComboBox列... 13

3.6 DataGridViewLinkColumn. 14

4 操作数据... 15

4.1 数据输入和验证的相关事件... 15

4.1.1 数据验证相关事件的顺序... 15

4.1.2 验证数据... 15

4.1.3 在新行中的数据输入... 16

4.2 关于Null值... 19

4.2.1 NullValue属性... 19

4.2.2 DataSourceNullValue属性... 19

4.3 DataError事件... 20

4.4 数据绑定模式... 21

4.4.1 非绑定模式... 21

4.4.2 绑定模式... 21

4.4.3 虚拟模式... 22

4.4.4 混合模式... 22

5 Overview of features. 24

5.1 Styling. 24

5.1.1 The DataGridViewCellStyle Class. 24

5.1.2 Using DataGridViewCellStyle Objects. 24

5.1.3 Style Inheritance. 25

5.1.4 Setting Styles Dynamically. 28

5.2 Custom painting. 28

5.2.1 Paint Parts. 28

5.2.2 Row Pre Paint and Post Paint 29

5.3 Autosizing. 30

5.3.1 Sizing Options in the Windows Forms DataGridView Control 30

5.3.2 Resizing with the Mouse. 31

5.3.3 Automatic Sizing. 32

5.3.4 Programmatic Resizing. 33

5.3.5 Customizing Content-based Sizing Behavior. 34

5.3.6 Content-based Sizing Options. 34

5.4 Selection modes. 34

5.4.1 Programmatic Selection. 35

5.5 Scrolling. 35

5.5.1 Scroll event 35

5.5.2 Scroll bars. 35

5.5.3 Scrolling Properties. 36

5.6 Sorting. 36

5.6.1 Programmatic Sorting. 37

5.6.2 Custom Sorting. 38

5.7 Border styles. 39

5.7.1 Standard Border Styles. 39

5.7.2 Advanced Border Styles. 39

5.8 Enter-Edit modes. 40

5.9 Clipboard copy modes. 40

5.10 Frozen columns/rows. 41

5.11 Implementing Custom cells and editing controls/cells. 41

5.11.1 IDataGridViewEditingControl 42

5.11.2 IDataGridViewEditingCell 42

5.12 Virtual mode. 42

5.12.1 Bound Mode and Virtual Mode. 42

5.12.2 Supplementing Bound Mode. 42

5.12.3 Replacing Bound Mode. 43

5.12.4 Virtual-Mode Events. 43

5.12.5 Best Practices in Virtual Mode. 44

5.13 Capacity. 44

6 Best Practices. 45

6.1 Using Cell Styles Efficiently. 45

6.2 Using Shortcut Menus Efficiently. 45

6.3 Using Automatic Resizing Efficiently. 45

6.4 Using the Selected Cells, Rows, and Columns Collections Efficiently. 46

6.5 Using Shared Rows. 46

6.6 Preventing Rows from Becoming Unshared. 47

附录 A – 常见问题:... 49

  1. 怎样使指定的单元格不可编辑?. 49
  2. 怎样让一个单元格不可用?. 49
  3. 怎样避免用户将焦点设置到指定的单元格?... 51
  4. 怎样使全部单元格总是显示控件(不论它是否处于编辑状态)?. 51
  5. Why does the cell text show up with “square” characters where they should be new lines?. 51
  6. 怎样在单元格内同一时候显示图标和文本?... 51
  7. 怎样隐藏一列?... 53
  8. 怎样避免用户对列排序?... 53
  9. 怎样针对多个列排序?. 54
  10. 怎样为编辑控件增加事件处理函数?. 58
  11. 应在何时移除编辑控件的事件处理函数?. 58
  12. 怎样处理ComboBox列中ComboBox控件的SelectIndexChanged事件?. 58
  13. 怎样通过拖放调整行的顺序?... 59
  14. 怎样调整最后一列的宽度使其占领网格的剩余客户区?... 60
  15. 怎样让TextBox类型的单元格支持换行?. 60
  16. 怎样使Image列不显示不论什么图像(字段值为null时)?. 61
  17. 怎样能够在ComboBox类型的单元格中输入数据?. 61
  18. How do I have a combo box column display a sub set of data based upon the value of a different combo box column? 61
  19. 怎样在用户编辑控件的时候(而不是在验证时)就显示错误图标?. 62
  20. 怎样同一时候显示绑定数据和非绑定数据?... 65
  21. How do I show data that comes from two tables?. 66
  22. 怎样显示主从表?... 66
  23. 怎样在同一DataGridView中显示主从表?... 68
  24. 怎样避免用户对列排序?. 68
  25. 怎样在点击工具栏button的时候将数据提交到数据库?... 68
  26. 怎样在用户删除记录时显示确认对话框?... 68

1 何为DataGridView
通过DataGridView控件,能够显示和编辑表格式的数据,而这些数据能够取自多种不同类型的数据源。

DataGridView控件具有很高的的可配置性和可扩展性,提供了大量的属性、解决方案和事件,能够用来对该控件的外观和行为进行自己定义。当你须要在WinForm应用程序中显示表格式数据时,能够优先考虑DataGridView(相比于DataGrid等其它控件)。假设你要在小型网格中显示仅仅读数据,或者同意用户编辑数以百万计的记录,DataGridView将为你提供一个易于编程和良好性能的解决方案。

DataGridView 用来替换先前版本号中的DataGrid,拥有较DataGrid许多其他的功能;但DataGrid仍然得到保留,以备向后兼容和将来使用。假设你要在两者中选择,能够参考下面给出的DataGrid 和DataGridView之间差别的细节信息。

1.1 DataGridView和DataGrid 之间的差别
DataGridView提供了大量的DataGrid所不具备的基本功能和高级功能。此外,DataGridView 的结构使得它较之DataGrid控件更容易扩展和自己定义。

下表描述了DataGridView提供而DataGrid未提供的几个主要功能。

DataGridView功能

描述

多种列类型

与DataGrid相比,DataGridView 提供了许多其他的内置列类型。这些列类型能够满足大部分常见须要,而且比DataGrid中的列类型易于扩展或替换。

多种数据显示方式

DataGrid仅限于显示外部数据源的数据。而DataGridView则能够显示非绑定的数据,绑定的数据源,或者同一时候显示绑定和非绑定的数据。你也能够在DataGridView中实现virtual mode,实现自己定义的数据管理。

用于自己定义数据显示的多种方式

DataGridView提供了许多属性和事件,用于数据的格式化和显示。比方,你能够依据单元格、行和列的内容改变其外观,或者使用一种类型的数据替代还有一种类型的数据。

用于更改单元格、行、列、表头外观和行为的多个选项

DataGridView使你能够以多种方式操作单个网格组件。比方,你能够冻结行和列,避免它们因滚动而不可见;隐藏行、列、表头;改变行、列、表头尺寸的调整方式;为单个的单元格、行和列提供工具提示(ToolTip)和快捷菜单。

唯一的一个DataGrid提供而DataGridView未提供的特性是两个相关表中数据的分层次显示(比方常见的主从表显示)。你必须使用两个DataGridView来显示具有主从关系的两个表的数据。

1.2 DataGridView的亮点
下表着重显示了DataGridView的主要特性,稍后会介绍它们的具体信息。

DataGridView控件特性

描述

多种列类型

DataGridView提供有TextBox、CheckBox、Image、Button、ComboBox和Link类型的列及对应的单元格类型。

多种数据显示方式

DataGrid仅限于显示外部数据源的数据。而DataGridView则能够显示非绑定的数据,绑定的数据源,或者同一时候显示绑定和非绑定的数据。你也能够在DataGridView中实现virtual mode,实现自己定义的数据管理。

自己定义数据的显示和操作的多种方式

DataGridView提供了许多属性和事件,用于数据的格式化和显示。

此外,DataGridView提供了操作数据的多种方式,比方,你能够:

对数据排序,并显示对应的排序符号(带方向的箭头表示升降序)
对行、列和单元格的多种选择模式;多项选择和单项选择
以多种格式将数据拷贝到剪贴板,包含text,CSV (以逗号隔开的值) 和 HTML
改变用户编辑单元格内容的方式
用于更改单元格、行、列、表头外观和行为的多个选项

DataGridView使你能够以多种方式操作单个网格组件。比方,你能够:

冻结行和列,避免它们因滚动而不可见;
隐藏行、列、表头;
改变行、列、表头尺寸的调整方式;
改变用户对行、列、单元格的选择模式;
为单个的单元格、行和列提供工具提示(ToolTip)和快捷菜单。
自己定义单元格、行和列的边框样式。
提供丰富的可扩展性的支持

DataGridView提供易于对网格进行扩展和自己定义的基础结构,比方:

处理自己定义的绘制事件能够为单元格、列和行提供自己定义的观感;
继承一个内置的单元格类型以为其提供许多其他的行为;
实现自己定义的接口以提供新的编辑体验。
2 DataGridView的结构
DataGridView及其相关类被设计为用于显示和编辑表格数据式数据的灵活的、可扩展的体系。这些类都位于system.Windows.Forms命名空间,它们的名称也都有共同的前缀"DataGridView"。

2.1 结构元素(Architecture Elements)
主要的DataGridView相关类继承自DataGridViewElement类。

DataGridViewElement类有两个属性,一是DataGridView,该属性提供了对其所属的DataGridView的引用;二是State,该属性表示当前的状态,其值为DataGridViewElementStates枚举,该枚举支持位运算,这意味着能够设置组合状态。

2.2 单元格和组(Cells and Bands)
DataGridView由两种主要的对象组成:单元格(cell)和组(band)。全部的单元格都继承自DataGridViewCell基类。 两种类型的组(或称集合)DataGridViewColumn和DataGridViewRow都继承自DataGridViewBand 基类,表示一组结合在一起的单元格。

DataGridView会与一些类进行互操作,但最常打交道的则是例如以下三个:DataGridViewCell, DataGridViewColumn,DataGridViewRow。

2.3 DataGridView的单元格 (DataGridViewCell)
单元格(cell)是操作DataGridView的基本单位。Display is centered on cells, and data entry is often performed through cells。能够通过DataGridViewRow 类的Cells 集合属性访问一行包含的单元格,通过DataGridView的SelectedCells集合属性访问当前选中的单元格,通过DataGridView的CurrentCell属性访问当前的单元格。

DataGridViewCell 类图

Cell 相关类和属性

DataGridViewCell是一个抽象基类,全部的单元格类型都继承于此。DataGridViewCell及其继承类型并非Windows Forms控件,但当中一些宿主于Windows Forms控件。单元格支持的编辑功能通常都由其宿主控件来处理。

DataGridViewCell对象不会像Windows Forms控件那样控制自己的外观和绘制(painting)特征,相反的,DataGridView会负责其包含的单元格的外观。通过DataGridView 控件的属性和事件,你能够深刻地影响单元格的外观和行为。假设你对单元格定制有特殊要求,超出了DataGridView提供的功能,能够继承DataGridViewCell或者它的某个子类来满足这些要求。

2.3.1 DataGridViewCell的工作机制

理解DataGridView结构的一个重要部分是理解DataGridViewCell的工作机制:

单元格的值(A Cell’s Value)

单元格的值是其根本所在。假设单元格所在列不是绑定列,并且所在的DataGridView也不是Virtual Mode,那么它的值就由它本身所持有并维护。对于那些由绑定产生的单元格,它们压根儿就不“知道”该持有什么值,当然也就不会去维护了;当DataGridView须要单元格的值的时候,它会到数据源中查询该单元格应当显示的值。在Virtual Mode下,除了会触发CellValueNeeded事件以获取对应单元格的值外,与数据绑定方式很相似。在单元格级,全部这些由DataGridViewCell.GetValue() 解决方案来控制。

默认情况下,单元格的值的类型为object。当一个列被绑定后,会设置它的ValueType属性,它包含的单元格的ValueType也随之更新。而单元格的ValueType对于下一步的格式化很重要。

格式化显示(Formatting for Display)

注意:当DataGridView须要了解“怎样显示这个单元格”时,它须要的是单元格的FormattedValue ,而不是Value。这是一个复杂的过程,因为格式化屏幕上的一些内容通常须要将它转换为字符串。比如,尽管你将单元格的值(Value)设置为整型值155,在显示它的时候仍须要将其格式化。单元格和其所在的列的FormattedValueType 属性决定了显示它时所用的类型。多数列使用字符串类型,而Image和CheckBox类型的单元格/列则使用其它类型。Image类型的单元格和列使用Image作为默认的FormattedValueType,它的内置实现了解怎样去显示一个Image。CheckBox类型的单元格/列的FormattedValueType属性则取决于属性ThreeState的值。在单元格级,全部这些由DataGridViewCell.GetFormattedValue()控制。

默认情况下,DataGridView使用TypeConverter将单元格的值(Value)转换为格式化的值(FormattedValue)。DataGridView会基于单元格的ValueType和FormattedValueType属性来获取合时的TypeConverter。

对于一个单元格,FormattedValue会得到多次请求(即会在多个地方用到):绘制单元格的时候,所在列依据单元格内容自己主动调整大小的时候,甚至是在推断鼠标是否经过单元格内容时。每次须要FormattedValue的时候,DataGridView会触发CellFormatting事件,这时你就有机会改动单元格的格式化显示了。

假设单元格不能获取它的格式化值,它会触发DataError事件。

格式化显示单元格还包含以怎样的首选尺寸显示它。这个首选尺寸是由单元格的FormattedValue,填充区域(padding),附加显示和边框合并而成。

绘制单元格的显示(Painting the Display)

在获得FormattedValue 后,单元格将负责绘制它的内容。单元格决定了绘制过程所使用的正确样式(参见本文档第五章的样式部分)并进行绘制。记住:假设单元格不去绘制自己,那么该单元格将不会有不论什么内容得到绘制(即单元格的绘制仅仅由它自己负责),行、列不会负责绘制不论什么内容,因此要确保至少要绘制单元格的背景(background),否则单元格所在的矩形区域仍然是无效的(即未经绘制)。

解析单元格的显示(Parsing the Display)

用户开始与单元格交互后,可能会编辑单元格的值。有一件事要记住,用户编辑的实际上是单元格的FormattedValue。用户提交所编辑的值时,FormattedValue须要转换回单元格的值(Value),这个过程称为解析(parsing)。在单元格级上,全部这些工作由单元格的DataGridViewCell.ParseFormattedValue(int rowIndex)解决方案控制。

默认情况下,会再次使用TypeConverter来将FormattedValue解析为单元格的真实值,这时会触发DataGridView的CellParsing事件,这时你就有机会改动单元格的解析方式了。.

假设单元格不能得到正确地解析,会触发DataError事件。

2.3.2 常见问题

1) 怎样使指定的单元格不可编辑?

2) 怎样让一个单元格不可用(disable)?

3) 怎样避免用户将焦点设置到指定的单元格?

4) 怎样使全部单元格总是显示控件(不论它们是否处于编辑状态)?

5) Why does the cell text show up with “square” characters where they should be new lines?

6) 怎样在单元格内同一时候显示图标和文本?

2.4 DataGridView的列(DataGridViewColumn)
DataGridView所附带的数据(这些数据能够通过绑定或非绑定方式附加到控件)的结构表现为DataGridView的列。你能够使用DataGridView的Columns集合属性访问DataGridView所包含的列,使用SelectedColumns 集合属性访问当前选中的列。

DataGridViewColumn 类图

Column 相关类和属性

一些主要的单元格类型拥有对应的列类型,这些列类型继承自DataGridViewColumn基类。

常见问题:

1) 怎样隐藏一列?

2) 怎样避免用户对列排序?

3) 怎样针对多个列排序?

2.5 DataGridView的编辑控件(Editing Controls)
支持高级编辑功能的单元格一般都使用一个继承自Windows Forms控件的宿主控件,这些控件同一时候也实现了IDataGridViewEditingControl接口。

DataGridView Editing Control Class diagram

Classes that implement Editing Controls

下表说明了单元格类型、列类型、编辑控件间的关系:

单元格类型

宿主控件

列类型

DataGridViewButtonCell

n/a

DataGridViewButtonColumn

DataGridViewCheckBoxCell

n/a

DataGridViewCheckBoxColumn

DataGridViewComboBoxCell

DataGridViewComboBoxEditingControl

DataGridViewComboBoxColumn

DataGridViewImageCell

n/a

DataGridViewImageColumn

DataGridViewLinkCell

n/a

DataGridViewLinkColumn

DataGridViewTextBoxCell

DataGridViewTextBoxEditingControl

DataGridViewTextBoxColumn

常见问题(FAQ)

1) 怎样为编辑控件增加事件处理函数?

2) 应在何时移除编辑控件的事件处理函数?

3) 怎样处理ComboBox列中Combox控件的SelectIndexChanged事件?

4) 怎样使全部单元格总是显示控件(不论它是否处于编辑状态)?

2.6 DataGridViewRow
DataGridViewRow类用于显示数据源的一行数据。能够通过DataGridView控件的Rows集合属性来访问其包含的行,通过SelectedRows集合属性访问当前选中的行。

DataGridViewRow类图

Row相关的类和属性

你能够继承DataGridViewRow类来实现自己的行类型,尽管多数情况下这并不必要。DataGridView 有几个行相关的事件和属性,用以自己定义其包含的DataGridViewRow对象的行为。

假设你将DataGridView的AllowUserToAddRows属性设为true,一个专用于增加新行的特殊行会出如今最后一行的位置上,这一行也属于Rows集合,但它有一些须要你提起注意的特殊功能,要获得这方面的许多其他信息,请参看4.1.3节。

2.6.1 常见问题

1) 怎样通过拖放调整行的顺序?

3 列/单元格类型揭密(column/cell types)
DataGridView控件提供了几种列类型用以显示数据,并同意用户改动和增加数据。

当你对DataGridView进行了绑定,并将它的AutoGenerateColumns属性设置为true,它会依据数据源中列的数据类型自己主动生成列,这些列都使用对应的默认类型(与数据源列数据类型相适应)。

你也能够自行创建列的实例,将它们添加DataGridView的Columns集合中,这些列可用作非绑定列,也能够以手动方式让它们用于绑定数据。手动绑定的列很实用,比方,自己主动生成的列都采用与数据源的列对应的默认类型,而你不想用默认列类型。

下表描述了DataGridView 的各种列对应的类:

列类型

描述

DataGridViewTextBoxColumn

用于基于文本的值。绑定到数字和字符串值时会自己主动生成这种类型的列。

DataGridViewCheckBoxColumn

用于显示Boolean和CheckState类型的值,绑定到上述类型值时会自己主动生成这种类型的列。

DataGridViewImageColumn

用于显示图像。绑定到byte数组,Image对象,图标对象时会自己主动生成这种类型的列。

DataGridViewButtonColumn

用于在单元格内显示button。在绑定时不会自己主动生成,一般用于非绑定列。

DataGridViewComboBoxColumn

用于在单元格内显示下拉列表。在绑定时不会自己主动生成,一般地须要手工绑定。

DataGridViewLinkColumn

用于在单元格内显示链接。在绑定时不会自己主动生成,一般地须要手工绑定。

自己定义列类型

通过继承DataGridViewColumn 类或其子类,你能够创建自己的列类型,以提供自己定义的外观、行为和宿主控件。

常见问题(FAQ)

1) 怎样隐藏一列?

2) 怎样使特定的单元格不可编辑?

3) 怎样避免用户将焦点设置到指定的单元格?

4) 怎样调整最后一列的宽度使其占领网格的剩余客户区?

3.1 DataGridViewTextBoxColumn
DataGridViewTextBoxColumn是一种通用的列类型,用于表示基于文本的值,比方数字和字符串。在编辑模式下,会有一个TextBox控件出如今当前活动单元格,用户能够改动单元格的值。

单元格的值在显示时会自己主动转换为字符串。用户输入或改动的值在提交时则被自己主动解析为合适的数据类型以创建一个单元格的值。通过处理CellFoamatting和CellParsing事件,你能够自己定义这些转换的方式。比方将数据源的日期字段以特定的形式显示,对某些特殊单元格作出特殊的标记。

对一列来说,它包含的单元格值的数据类型由该列的ValueType属性指定。

3.1.1 常见问题

1) 怎样让TextBox类型的单元格支持换行?

2) Why does the cell text show up with “square” characters where they should be new lines?

3) 怎样在单元格内同一时候显示图标和文本?

4) 怎样避免用户将焦点设置到指定的单元格?

3.2 DataGridViewCheckBoxColumn
DataGridViewCheckBoxColumn用于显示Boolean或CheckState类型的值。Boolean 值显示为二元(two-state)或三元 (three-state) 的CheckBox,而这取决于该列的ThreeState 属性的值。假设该类型的列绑定到CheckState类型的值,ThreeState属性的默认值为true。

普通情况下,CheckBox类型的单元格要么用于存储数据,就像其它类型的数据一样,要么用于进行一些重要操作。用户点击CheckBox单元格时,假设你希望对此马上做出反应,能够处理CellClick事件,但该事件发生在单元格的值更新之前。假设点击之时就希望获得新值,一种选择是依据当前值计算点击后的值;还有一种解决方案是马上提交值的变化,然后在CellValueChanged事件处理函数中对此作出反应,而要在用户点击单元格时马上提交值的变化,你必须处理CurrentCellDirtyStateChanged事件,在这里,调用CommitEnd解决方案提交新值。

3.3 DataGridViewImageColumn
DataGridViewImageColumn 类型的列用于显示图像。这种类型的列有三种解决方案生成:绑定到数据源时自己主动生成;为非绑定列手动生成;在CellFormatting事件处理函数(该事件发生在单元格显示前)中动态生成。

绑定到数据源时自己主动生成Image列的解决方案适用于大量的图像格式,包含.NET中Image类支持的各种格式,还有Access数据库及Northwind范例数据库使用的OLE图片格式。

假设你想提供DataGridViewButtonColumn列的功能,又希望显示自己定义的外观,手动生成Image列会很实用。在显示后,你能够处理CellClick事件以处理用户对单元格的点击(模拟button列)。

假设你要为计算值或非图片的值提供图片显示,在CellFormatting事件处理函数中动态生成Image列的解决方案会很实用。比方,你有一个表示风险值的列,它的值可能是”high”、”middle”或”low”,能够为它们显示不同的图标作为警示;或者你有一个名为”Image”的列,它的值时图片文件的位置而不是真实的图片内容,也能够用这种解决方案。

3.3.1 常见问题

1) 怎样使Image列不显示不论什么图像(字段值为null时)?

3.4 DataGridViewButtonColumn
使用DataGridViewButtonColumn 列,能够在单元格内显示button。假设你要为用户操作特定行提供一种简单的方式,Button列会很实用,比方排序或在还有一个窗口中显示子表记录。

在对DataGridView进行数据绑定时不会自己主动生成Button列,所以你必须手动创建它们,然后把它们增加到DataGridView控件的Columns集合中。

你能够处理CellClick事件以响应用户的点击动作。

3.5 DataGridViewComboBoxColumn
在DataGridViewComboBoxColumn类型的列中,你能够显示包含下拉列表的单元格。这在仅同意用户输入一些特定值的时候显得很实用,比方在SQL Server演示例子数据库Northwind中Products表的Category列,它表示产品的种类,这个应仅仅同意选择现有的产品种类,此时就能够使用ComboBox列。

假设你了解怎样为ComboBox控件生成下拉列表,就能够用相同的方式为ComboBox列中的全部单元格生成下拉列表。要么通过列的Items集合手动增加,要么通过DataSource,DisplayMember 和ValueMember属性绑定到一个数据源。要了解当中的许多其他信息,能够参考WinForms中ComboBox空间的使用方法。

你能够将ComboBox列的单元格的实际值绑定到DataGridView控件本身的数据源(注意不是ComboBox列的数据源),这须要设置该列的DataPropertyName属性(设置某个列的名称)。

ComboBox列不会在数据绑定时自己主动生成,所以你必须手动创建它们,然后将其增加到Columns集合属性中。另外,你也能够使用设计器,在设计时设置对应的属性,这个过程相似于在设计器中ComboBox控件的使用。

3.5.1 DataError事件和ComboBox列

在使用DataGridViewComboBoxColumn 时,有时会改动单元格的值或启动ComboBox控件的Items集合,这样可能会引发DataError事件。这是ComboBox列的设计使然,ComboBox列的单元格会进行数据验证。在ComboBox列的单元格尝试绘制包含的内容时,它须要将包含的值进行格式化(见第二章第三节),在此转换过程中,它会在ComboBox的Items集合中查找对应的值,假设查找失败,就会引发DataError事件。忽略了DataError事件可能会使单元格不能进行正确的格式化。

3.5.2 常见问题

1) 怎样能够在ComboBox类型的单元格中输入数据?

2) How do I handle the SelectedIndexChanged event?

3) How do I have a combo box column display a sub set of data based upon the value of a different combo box column?

本文转自博客园知识天地的博客,原文链接:DataGridView使用方法汇总 需转载请自行联系原博主。

相关文章
|
C# Windows 容器
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
NotifyIcon控件表示系统右下角任务栏上的托盘图标,其ShowBalloonTip方法用于显示气球状提示框(Win10只有为本地Toast通知),ToolTip\oolTipText可以...
2739 0
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
|
数据挖掘 Java API
唯品会商品列表数据接口(Vip.item_search)丨唯品会 API 接口
唯品会商品列表数据接口(Vip.item_search)丨唯品会 API 接口
|
11月前
|
监控 微服务 Python
微服务的故障恢复与弹性设计
【8月更文第29天】在微服务架构中,由于服务间的相互依赖,任何单点故障都可能导致整个系统崩溃。因此,设计具备高可用性和弹性的微服务系统至关重要。本文将探讨如何通过重试机制、断路器和超时设置等策略来增强系统的容错能力和恢复能力。
440 1
|
8月前
|
人工智能 Java 编译器
.NET 9 发布 性能提升、AI 支持与全方位改进
【11月更文挑战第5天】.NET 9 引入了多项改进,包括性能提升、AI 支持和全方位功能优化。性能方面,编译器增强、服务器 GC 优化、矢量化和硬件支持等提升了执行效率。AI 方面,新增学习材料、合作伙伴生态、原生支持和生成式 AI 集成。此外,.NET Aspire 组件升级、编程语言新功能和开发工具更新进一步提升了开发体验。
185 3
|
9月前
|
监控 前端开发 安全
C#一分钟浅谈:文件上传与下载功能实现
【10月更文挑战第2天】在Web应用开发中,文件的上传与下载是常见需求。本文从基础入手,详细讲解如何在C#环境下实现文件上传与下载。首先介绍前端表单设计及后端接收保存方法,使用`<input type="file">`与`IFormFile`接口;接着探讨错误处理与优化策略,如安全性验证和路径管理;最后讲解文件下载的基本步骤,包括确定文件位置、设置响应头及发送文件流。此外,还提供了进阶技巧,如并发处理、大文件分块上传及进度监控,帮助开发者构建更健壮的应用系统。
462 15
|
数据可视化 数据挖掘 Python
【Python DataFrame专栏】DataFrame的可视化探索:使用matplotlib和seaborn
【5月更文挑战第20天】本文介绍了使用Python的pandas、matplotlib和seaborn库进行数据可视化的步骤,包括创建示例数据集、绘制折线图、柱状图、散点图、热力图、箱线图、小提琴图和饼图。这些图表有助于直观理解数据分布、关系和趋势,适用于数据分析中的探索性研究。
249 1
【Python DataFrame专栏】DataFrame的可视化探索:使用matplotlib和seaborn
|
SQL 关系型数据库 MySQL
Flink CDC产品常见问题之读分布式mysql报连接超时如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
监控 网络架构
掌握网络设计:子网划分详解
【4月更文挑战第22天】
888 0
|
算法 数据可视化
bilibili视频流量数据潜望镜
bilibili视频流量数据潜望镜