首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
wangchinaking (57)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
smallnest (61)
iiprogram (64)
downmoon (32)
danny_xcz (49)
btbtd (81)
CSDN - 文档中心 - .NET 阅读:18464   评论: 20    参与评论
标题   Henry手记:WinForm Datagrid结构剖析(一)     选择自 Latitude 的 Blog
关键字   .net WinForm Datagrid
出处  

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

                                    韩睿 2002-11-14

 

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

一、  基本结构

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

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

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

 

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

那么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)结束。

最后的效果图为:

----

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

QQ: 18349592

E-Mail: henry7685@hotmail.com


相关文章
对该文的评论
CSDN 网友 ( 2005-05-10)
Very Good!
不过还有一个问题,就是Datagrid中Cell被选中的时候,点右键时候,系统会自动弹出一个系统的菜单,请问如何才能够屏蔽之!
gdcrx ( 2004-12-27)
我怎么看不到插图啊?
zzh1101 ( 2004-12-24)
ASP。NET:在DataGrid中如何设定其中某一列的背景色,还有如何设定某一单元格的背景色
CSDN 网友 ( 2004-10-25)
为什么不用 MappingType.Hidden ???
dongfly ( 2004-05-18)
aColumnTextColumn.TextBox.AutoSize = True  根本不会自动调整,这不知道是怎么回事!