用嵌套的DataGrid实现主从式表的显示
点击次数:21 次 发布日期:2008-11-26 11:15:25 作者:源代码网
|
源代码网推荐 源代码网推荐 如何实现主从式表的显示问题是我开发中所遇到的一个难题,在这个问题中还涉及到在DataGrid中使用复选框控件和定制DataGrid的单元格的问题。下面就这三个问题逐一进行解决。 源代码网推荐 源代码网推荐 一、在DataGrid中使用复选框控件 源代码网推荐 源代码网推荐 这个问题的解决有几种方式,我选用了一种既适用于复选框控件又适用于单选框控件的方式。具体实现如下: 源代码网推荐 源代码网推荐 为DataGrid创建一个ButtonColumn,或者创建一个模板列,在模板列中放入一个Label控件(注:这些控件的选择并不是唯一的)。然后在DataGrid的ItemDataBound事件过程中生成复选框控件(单选框控件)的HTML标记并设置其相应的属性,就可以实现在DataGrid表中进行多选(单选)的功能。生成复选框控件的HTML标记的语句如下: 源代码网推荐 源代码网推荐 1 If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then 源代码网推荐 源代码网推荐 2 Dim r As LinkButton 源代码网推荐 源代码网推荐 3 r = e.Item.Cells(2).Controls(0) 源代码网推荐 源代码网推荐 4 r.Text = "<input type=checkbox name="chbRights" value="" & strID & "" >" 源代码网推荐 源代码网推荐 5 End If 源代码网推荐 源代码网推荐 这种情况下,checkbox或radio不能自动进行状态的管理,需要手动维持状态,也就是在表单提交到服务器返回浏览器显示的时候能够显示出提交前所进行的最后选择。这一步的实现并不难,先通过SelectResult = Request.Form("chbRights")语句获得表单提交的选择结果,然后将上面的第4句作如下修改: 源代码网推荐 源代码网推荐 if SelectResult.IndexOf(strID) <> -1 then 源代码网推荐 源代码网推荐 r.Text = "<input type=checkbox name="chbRights" value="" & strID & "" checked>" 源代码网推荐 源代码网推荐 else 源代码网推荐 源代码网推荐 r.Text = "<input type=checkbox name="chbRights" value="" & strID & "" >" 源代码网推荐 源代码网推荐 end if 源代码网推荐 源代码网推荐 二、定制DataGrid的单元格 源代码网推荐 源代码网推荐 假设要完成的表格样式如下: 源代码网推荐 源代码网推荐 Header1 源代码网推荐 源代码网推荐 源代码网推荐 Header2 源代码网推荐 源代码网推荐 源代码网推荐 Header3 源代码网推荐 源代码网推荐 源代码网推荐 Header4 源代码网推荐 源代码网推荐 Item1 源代码网推荐 源代码网推荐 源代码网推荐 DataGrid1 源代码网推荐 源代码网推荐 Item2 源代码网推荐 源代码网推荐 源代码网推荐 DataGrid2 源代码网推荐 源代码网推荐 表1 源代码网推荐 源代码网推荐 其中Header有4列,每个Item只有2列。 源代码网推荐 源代码网推荐 这个是在DataGrid的ItemCreated事件过程中来具体实现的。首先创建Header,对于以上表格而言,它的Header缺省的是和Item一样有2列。那么我们要先清除Header中缺省的单元格控件,然后逐一创建Header1、Header2、Header3、Header4四个单元格控件。具体实现如下: 源代码网推荐 源代码网推荐 1、 利用语句e.Item.ItemType = ListItemType.Header来找到DataGrid的Header; 源代码网推荐 源代码网推荐 2、 清除Header中的缺省控件; 源代码网推荐 源代码网推荐 e.Item.Controls.Clear() 源代码网推荐 源代码网推荐 3、 创建新的单元格控件, 源代码网推荐 源代码网推荐 dim cell0 as new TableCell 源代码网推荐 源代码网推荐 cell0.Controls.Add(new LiteralControl("Header1")) 源代码网推荐 源代码网推荐 e.Item.Controls.Add(cell0) 源代码网推荐 源代码网推荐 并可以通过以下语句对单元格的风格、背景、宽度、高度、位置等属性进行设置: 源代码网推荐 源代码网推荐 cell0.MergeStyle(dgAllRights.HeaderStyle) 源代码网推荐 源代码网推荐 cell0.BackColor = Color.FromName("#8faae7") 源代码网推荐 源代码网推荐 cell0.Width = Unit.Percentage(10) 源代码网推荐 源代码网推荐 cell0.Height = Unit.Pixel(intHeight) 源代码网推荐 源代码网推荐 cell0.HorizontalAlign = HorizontalAlign.Center 源代码网推荐 源代码网推荐 4、 重复第3步,创建其它三个单元格控件。 源代码网推荐 源代码网推荐 到此为止,Header就创建好了,但是由于Header的改变,导致Item的列出现了变化,由2列变成了4列,所以我们需要进行Item的单元格合并操作,具体语句如下: 源代码网推荐 源代码网推荐 "设置Item第二列的ColumnSpan合并单元格属性 源代码网推荐 源代码网推荐 If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then 源代码网推荐 源代码网推荐 dim cell as TableCell 源代码网推荐 源代码网推荐 cell = e.Item.Cells(1) 源代码网推荐 源代码网推荐 cell.ColumnSpan = 3 源代码网推荐 源代码网推荐 end if 源代码网推荐 源代码网推荐 三、DataGrid嵌套显示主从式表 源代码网推荐 源代码网推荐 经过以上两个问题的解决,尤其是第二个问题的解决,可以说现在这个问题的实现就非常容易了。 源代码网推荐 源代码网推荐 首先为主DataGrid创建一个模板列,在该模板列中放置从DataGrid控件,从DataGrid控件的ShowHeader属性设为false,复选框控件的使用由从DataGrid控件来实现,而主DataGrid的表格形式要根据上述的第二个问题来定制。所以主DataGrid和从DataGrid控件的数据源也可以是不同的。然后根据自己的需要进行样式的设定,以下是最终形成的结果: 源代码网推荐 源代码网推荐 当然,除了这种方法以外,一定还有其它的方法可以实现,关键是多尝试,在不断尝试的过程中一定会有一些意想不到的收获。 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
