Henry手记:WinForm Datagrid结构剖析(三)

** Henry ** ** 手记 — WinForm Datagrid ** ** 结构剖析(三) **

韩睿 ( 2002-12-18 )

大家好,很高兴又能和大家见面了,不知道大家对前两篇关于 Datagrid 结构的文章了解得如何,今天讨论的问题是在它们基础上开展的,因此笔者希望您能看一下 前两篇文章 以获得必要的概念。

三、自定义列类

本节主要是和大家一起讨论一下怎样自建一个列类,并加入到 Datagrid 中进行使用。在上一节中和大家一起讨论了 DataGridTextBoxColumn类,并在它基础上生成了一个继承自DataGridTextBoxColumn的具有改变cell与行(即一行内的cell的集合)变色能力的DataGridColoredTextBoxColumn类。要实现创建一个列类,应该很好地再次研究一下DataGridTextBoxColumn类,并据此相似的创建一个新类,本次示例是要创建一个具有下拉框的列(如图1所示),因此,它应该与DataGridTextBoxColumn类是同级的,也就是说它们应该是从同个父类派生出来的,这样才可以在保证在使用上的相似性与一致性。

图1 具有下拉框列的Datagrid

1. 何时会用到下拉框?

什么时候会用到下拉框列,一般来说,是当要在 cell中填的内容是确知的几种可能之一时才会使用。那么数据源可能就会来自于两张数据表,一张是Datagrid整体体现的数据表,另一张是记录下拉框列表内容的。(当然,下拉框列表内容也可以不存放于数据库中,只是为了统一管理,笔者习惯于这么做)。在本例中,Datagrid的数据源为:

图2 Datagrid数据源

其中,“客户”表是 Datagrid整体显示出来的内容的源表,由于“国家”列中所填的是确认的几个国家,因此笔者用“国家”表来记录在下拉框列表中显示出来的供用户选择的国家名。

2. 下拉框列的使用过程

现在来看一下下拉框列的使用过程:

图 3 下拉框使用过程演示

从图 3 中,我们可以方便的了解到下拉框列的处理过程,在平常状况下,该列中的 cell 还是以 textbox 的形式进行显示的,下拉框的出现是被 textbox 中落入焦点才激发的,而后,该 cell 就是一个实实在在的下拉框了,当焦点离开该 cell 后, cell 又恢复成一个 textbox 的模样了。

3. 类的制作

正式要开工了,先理一下思路,我们要做些什么事:

(1) 从 DataGridTextBoxColumn类的父类 DataGridColumnStyle 继承一个自定义列类: DataGridComboBoxColumn;

(2) 在列中加入一个 ComboBox实例,用于聚焦后的出现,与DataGridTextBoxColumn类使用的textbox所属的DataGridTextBox类相似的,我们应该设计一个专用的combobox类提供给DataGridComboBoxColumn类使用。

(3) 跟踪 cell的状态,当聚焦时在textbox的外面添加一个combobox,失去焦点后隐藏起combobox,恢复成textbox;

(4) 重写父类的 Edit与Paint方法,以适应Combobox的使用(关于Paint问题的具体讨论请见上一节)在Edit中将Combobox中产生的(用户输入或在下拉框中选择)变化记录入cell中,这也便于在更改后更新到相关的数据源中去,在本例中,笔者主要是示例实现下拉框与数据源的绑定功能,因此不支持用户输入,反而关注Combobox的DisplayMember与ValueMember属性,用于体现和数据源的关系。这点需要读者注意,如果您希望同时实现用户输入(这倒不是Combobox的优点了,对吧?)需要对笔者的代码进行适当的修改。

类的代码与使用方法请见“(三)类代码”与“(三)使用代码”两篇文章。

本节只是从概念角度描述了新建一个列的思路与所需要进行的工作。 Datagrid结构剖析也即将告一段落,本系列旨在抛砖引玉,希望给大家一点有益的启发,有利于学习与工作。接下来,笔者会和大家一起讨论Datagrid的事件响应机制与方法,以及与数据库连接的高级应用。大家也可以写信给我,告知您对于Datagrid关心的内容,笔者会选择问题较集中的方面与大家进行新的讨论。祝大家学习进步,事业有成!

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: [email protected]

请访问本人专栏: http://www.csdn.net/develop/author/netauthor/Latitude/

Published At
Categories with Web编程
Tagged with
comments powered by Disqus