Henry手记— WinForm Datagrid结构剖析(一)
点击次数:15 次 发布日期:2008-11-26 11:11:09 作者:源代码网
|
源代码网推荐 韩睿 (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)结束。 源代码网推荐 源代码网推荐 最后的效果图为: 源代码网推荐 源代码网推荐 ---- 源代码网推荐 源代码网推荐 声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。 源代码网推荐 源代码网推荐 QQ: 18349592 源代码网推荐 源代码网推荐 E-Mail: henry7685@hotmail.com 源代码网推荐 源代码网推荐 作者Blog:http://blog.csdn.net/Latitude/ 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
