首页 > 开发 > 综合 > 正文

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

2024-07-21 02:27:51
字体:
来源:转载
供稿:网友
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) '重绘所有的列

            acolumntextcolumn = new datagridtextboxcolumn()

            '要更改列头名,请改下句的headertext值

            acolumntextcolumn.headertext = dt.columns(i).columnname ☆

acolumntextcolumn.mappingname = dt.columns(i).columnname ☆

‘控制列宽与行宽

if i = 1 then

      ts.preferredcolumnwidth = 50  

ts.preferredrowheight = 20   

end if

ts.alternatingbackcolor = color.lightgray   '设定交替行的背景色

            ts.gridcolumnstyles.add(acolumntextcolumn)  '增加一种自定义的column风格

            i = (i + 1)

        loop

        datagrid1.tablestyles.add(ts) '增加一种自定义的表风格

        '注:增加风格后,你在datagrid中实时增加新的纪录,风格仍不会变



   自已定义datagrid的tablestyle的时候,具体的步骤如上面代码如示,画成步骤图就是:先设定每一个column的样式,如果想用textbox,就定义一个:

dim acolumntextcolumn as datagridtextboxcolumn

想控制每一列的列头标题及其列对应的数据库内容,就必须重写headtext与mappingname,也是必须要声明的两个属性,否则就不能够重写了。

acolumntextcolumn.headertext对应的就是列头

acolumntextcolumn.mappingname必须要注意了,它对应的是真实数据库的列名,因此不能随便改动。

有了这两个属性后,一个列就生成了,如果想改变列宽,就用:

ts.preferredcolumnwidth =50

如果想隐藏一列的话,就这样写:

ts.preferredcolumnwidth =0          很简单吧!

如果想让列宽根据数据内容自适应调整,可以这样处理:

acolumntextcolumn.textbox.autosize = true

ts.preferredcolumnwidth = acolumntextcolumn.textbox.width

将改变了的datagridtextboxcoulmn实例加入到gridcolumnstyles里去,代码为:

ts.gridcolumnstyles.add(acolumntextcolumn)

将每一列都重写以后(注意,如果你想自定义一个datagrid的tablestyle,必须对每一列的gridcolumnstyle都重写),将该自定义的tablestyle添加到datagrid的tablestyle里去即可:

datagrid1.tablestyles.add(ts)

通过这几个步骤,我们就控制了每一个cell是textbox的这种datagrid的部分属性(cell的前景色与背景色变化在下一节中进行讨论)

那么,如何在datagrid中加入一个checkbox列呢?相对于加入其它控件类型的column来说,还是不复杂的。

首先,我们得定义一个具有boolean类型的列,在上面代码中,加入:

dt.columns.add("列3", gettype(boolean))

dim row, row1 as datarow

        row = dt.newrow()

        row!列1 = "行1"

        row!列2 = 1

        row!列3 = false

        dt.rows.add(row)

        row1 = dt.newrow()

        row1!列1 = "行2"

        row1!列2 = 12

        row1!列3 = true

   dt.rows.add(row1)

然后就可以用如下的定义进行在datagrid中内嵌checkbox了,在上面的代码中补充如下代码:

        dim ac as datagridboolcolumn = new datagridboolcolumn()

ac.headertext = dt.columns(2).columnname

ac.mappingname = dt.columns(2).columnname

ts.gridcolumnstyles.add(ac)

当然要修改:do while (i < numcols)为do while (i < numcols-1)。然后在循环之后加入上面的三句代码。再用:datagrid1.tablestyles.add(ts)结束。

最后的效果图为:


----

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



,欢迎访问网页设计爱好者web开发。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表