日期:2011-03-09  浏览次数:20465 次

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

                                    韩睿 (2002-11-14)



早就想动手写这个专题,但一直有疑惑自己对于.net的winform中的Datagrid是不是已经能够进行全面的剖析。但近来问起相关问题的人越来越多,一来是使用.net的程序员在增多,二来是大家对Datagrid的使用已经摆脱了最初的显示数据的需求,想要进行高级一点的使用,就应该对Datagrid的结构有一个充分的认识,本文希望能够给有这方面需求的朋友一点小帮忙。

一、  基本结构

从外形上看,Datagrid是由多个表(table)组成的,table是由行(row)与列(column)组成的,行与列的交互,组成的一个个单元(cell)。我们的需要就是能控制每一个cell的变化,从而使row与column发生变化,最终形成table的变化。这每一种变化都可视为是Datagrid中table的一种风格格式(style)。

我们在往form上部署Datagrid控件后,会在其属性窗口下方会出现“自动套用格式”,它们的变化多是背景色(Backcolor)与前景色(Forecolor)与字体(Font)的变化。经过本文的讲述后,您将能够实现更多的格式变化。

描述基本结构,首先请看图1显示的内容:




但是,Datagrid并不能直接写入数据,在图1中显示的数据是由datagrid的datasource(数据源)决定的。而这个datasource是支持IEnumerable接口的对象,比如:Arraylist、Collection、Dataview、Datarow、Datatable等等。(这个问题不是本文讨论的重点,暂略过)

那么Datagrid的结构究竟是怎么样的?我尝试的画了一个结构图如图2所示:


为清晰所见,我们主要讨论Datagrid->DatagridTableStyle->DatagridColumnStyle这一支。我们平常所看到的默认结构Datagrid,即把DatagridColumnStyle设定为DatagridTextBoxColumn列结构,把datagrid的列设为由textbox组成。从而我们就可以看到图1显示出来的那种效果,每一个cell里都是一个textbox。同理,我们就知道如果把某一列的DatagridColumnStyle设定为DatagridBoolColumn列结构,就可以在该列中用checkbox控件显示与更改boolean类型的值了。我们甚至可以自定义某一列的列类型,加入combox等等,这方面内容在后文会有详述。

那么本节主要讨论的就是当cell是默认的textbox时,对datagrid表现出来的属性的变化,主要包括:列头、列宽、前景与背景色等。在以后的小节中,对扩展的功能进行描述,包括Datagrid中实现键盘与鼠标响应事件、加入自定义的列样式。

在图1中,我要更改列头的内容,是不是和更改表头(caption text)那样方便,只要在代码中写一句:

datagrid1.CaptionText ="Henry示例"       就行了呢?

可惜不是那么简单,正如我们在上文分析地那样,要控制某个列的内容与样式,必须通过更改DatagridColumnStyle来实现。那么,就开工吧:

'构建一简单的dataTable作为Datagrid的数据源

        Label1.Parent = DataGrid1

        Label1.BackColor = Color.Transparent

        Dim dt As DataTable

        dt = DataSet1.Tables.Add("MyTable")

        dt.Columns.Add("列1", GetType(String))

        dt.Columns.Add("列2", GetType(Integer))

        Dim row, row1 As DataRow

        row = dt.NewRow()

        row!列1 = "行1"

        row!列2 = 1

        dt.Rows.Add(row)

        row1 = dt.NewRow()

        row1!列1 = "行2"

        row1!列2 = 12

        dt.Rows.Add(row1)

        '构建完毕



Dim ts As New DataGridTableStyle()  '就是它决定了datagrid是什么样的

        Dim aColumnTextColumn As DataGridTextBoxColumn '决定每一列的样式

        DataGrid1.DataSource = dt  ‘ 设定数据源

        ts.MappingName = dt.TableName

       

        Dim numCols As Integer

        numCols = dt.Columns.Count ‘数据源的列数

        DataGrid1.CaptionText = "Henry示例"

        Dim i As Integer = 0



        Do While (i < numCols) '重绘所有的列