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

原创 2002年11月15日 14:57:00

                           Henry手记— WinForm Datagrid结构剖析(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                                    韩睿 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

Datagrid添加右键菜单

最近的一个项目前台使用的EasyUI,每个界面都有DataGrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,首先建一个DataGrid的表格。。。。...
  • u013036688
  • u013036688
  • 2015年08月14日 19:57
  • 1351

[随手记经验] 【转载】其实你不懂记账

这些问题你都能立马回答出来吗?  1、你的资产负债率是多少?  2、你的收支结余比例是多少?  3、上个月结余的钱都放在什么地方了?  4、目前你手上有多少可动用资金?  5、你的股票、基金等投资收益...
  • fishmai
  • fishmai
  • 2016年09月01日 12:58
  • 1044

《IT项目经理成长手记》读后有所思

最近看了一本潘东、韩秋泉先生合著的一本书《IT项目经理成长手记》,虽然与IT项目经理相关的书我看的不多,对于这个行业了解也不算太多,但是我依然认为这是一本很值得想要从事互联网产品、通信行业解决方案管理...
  • u013816144
  • u013816144
  • 2016年06月20日 21:53
  • 3633

winform开发框架常见的分层模式

winform开发框架,常见的分层模式,可以分为UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等。 这个分层,在Web项目或者WInform项目(包括WPF项目)这些分层都...
  • hjp1137
  • hjp1137
  • 2015年09月21日 10:27
  • 4066

深入剖析PE文件

 PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一、 基本结构。   上图便是PE文件的...
  • u014563989
  • u014563989
  • 2016年12月09日 16:41
  • 403

金蝶随手记java面经

金蝶随手记java面经 面试的是java开发岗
  • u010841296
  • u010841296
  • 2017年08月04日 20:29
  • 357

python源码分析----对象结构

在python中,所有的东西都是对象,整数是,方法也是,。。总之什么都是。。。。 在看python的代码实现中,可以随处看到指针类型:PyObject*,那么我们就先来看看PyObject这到底是怎么...
  • fjs_cloud
  • fjs_cloud
  • 2015年05月18日 12:51
  • 923

iOS 支付宝集成随手记

支付宝集成随手记(怕自己忘了再去踩坑) 1.在支付宝平台下载最新的SDK(目前最新15.3.7)https://docs.open.alipay.com/54/104509 2.将下载文件中的下面...
  • foreve9125
  • foreve9125
  • 2017年07月09日 15:57
  • 155

随手记java开发实习生面试

闲话大三暑假学校安排了实训计划,去一些公司体验实习,其实是去培训机构上课。8人一个宿舍,于是自己就开始了海投模式,现在基本弃疗了。。。投了8家,就一家回复了我。。。算了,还是去吧。没错我这次面试又是日...
  • qq_24489717
  • qq_24489717
  • 2017年06月09日 01:15
  • 826

Winfrom开发之通过treeview实现树形结构

Winfrom开发之通过treeview实现树形结构 方法一、 节点法 分析 节点法类似于树形结构中的树,通过父节点和子节点 以及节点深度来查找 根节点没有父节点 深度为0 部门与所属子部门的...
  • l1158513573
  • l1158513573
  • 2015年07月01日 20:00
  • 2250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Henry手记:WinForm Datagrid结构剖析(一)
举报原因:
原因补充:

(最多只允许输入30个字)