DataGridView控件详细介绍
通过datagridview控件,可以显示和编辑表格式的数据,而这些数据可以取自多种不同类型的数据源。
datagridview控件具有很高的的可配置性和可扩展性,提供了大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。当你需要在winform应用程序中显示表格式数据时,可以优先考虑datagridview(相比于datagrid等其它控件)。如果你要在小型网格中显示只读数据,或者允许用户编辑数以百万计的记录,datagridview将为你提供一个易于编程和良好性能的解决方案。
datagridview 用来替换先前版本中的datagrid,拥有较datagrid更多的功能;但datagrid仍然得到保留,以备向后兼容和将来使用。如果你要在两者中选择,可以参考下面给出的datagrid 和datagridview之间区别的细节信息。
1.1datagridview和datagrid 之间的区别
datagridview提供了大量的datagrid所不具备的基本功能和高级功能。此外,datagridview 的结构使得它较之datagrid控件更容易扩展和自定义。
下表描述了datagridview提供而datagrid未提供的几个主要功能。
datagridview功能 |
描述 |
多种列类型 |
与datagrid相比,datagridview 提供了更多的内置列类型。这些列类型能够满足大部分常见需要,而且比datagrid中的列类型易于扩展或替换。 |
多种数据显示方式 |
datagrid仅限于显示外部数据源的数据。而datagridview则能够显示非绑定的数据,绑定的数据源,或者同时显示绑定和非绑定的数据。你也可以在datagridview中实现virtual mode,实现自定义的数据管理。 |
用于自定义数据显示的多种方式 |
datagridview提供了很多属性和事件,用于数据的格式化和显示。比如,你可以根据单元格、行和列的内容改变其外观,或者使用一种类型的数据替代另一种类型的数据。 |
用于更改单元格、行、列、表头外观和行为的多个选项 |
datagridview使你能够以多种方式操作单个网格组件。比如,你可以冻结行和列,避免它们因滚动而不可见;隐藏行、列、表头;改变行、列、表头尺寸的调整方式;为单个的单元格、行和列提供工具提示(tooltip)和快捷菜单。 |
唯一的一个datagrid提供而datagridview未提供的特性是两个相关表中数据的分层次显示(比如常见的主从表显示)。你必须使用两个datagridview来显示具有主从关系的两个表的数据。
1.2datagridview的亮点
下表着重显示了datagridview的主要特性,稍后会介绍它们的详细信息。
datagridview控件特性 |
描述 |
多种列类型 |
datagridview提供有textbox、checkbox、image、button、combobox和link类型的列及相应的单元格类型。 |
多种数据显示方式 |
datagrid仅限于显示外部数据源的数据。而datagridview则能够显示非绑定的数据,绑定的数据源,或者同时显示绑定和非绑定的数据。你也可以在datagridview中实现virtual mode,实现自定义的数据管理。 |
自定义数据的显示和操作的多种方式 |
datagridview提供了很多属性和事件,用于数据的格式化和显示。 此外,datagridview提供了操作数据的多种方式,比如,你可以:
|
用于更改单元格、行、列、表头外观和行为的多个选项 |
datagridview使你能够以多种方式操作单个网格组件。比如,你可以:
|
提供丰富的可扩展性的支持 |
datagridview提供易于对网格进行扩展和自定义的基础结构,比如:
|
2datagridview的结构
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.3datagridview的单元格 (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.1datagridviewcell的工作机制
理解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事件。
上一篇: Android自定义状态栏颜色与APP风格保持一致的实现方法
下一篇: java基础练习题