今天看到一篇文章,提出使用RenderMethod委托可以实现DataGrid表头的合并。自己测试了一下,效果不错,把DataGrid的表头转化为用Table来控制,就可以随心所欲了。可能前面有人用这种方法是实现过,但是我还是把代码贴上来,大家分享一下
1
using System;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Web;
7
using System.Web.SessionState;
8
using System.Web.UI;
9
using System.Web.UI.WebControls;
10
using System.Web.UI.HtmlControls;
11
using System.Data.SqlClient;
12
13
namespace WebDataGridHeader
14
{
15
/// <summary>
16
///DataGrid表头合并问题
17
/// </summary>
18
public class WebForm1 : System.Web.UI.Page
19
{
20
protected System.Web.UI.WebControls.DataGrid DataGrid1;
21
protected System.Web.UI.WebControls.Label Label1;
22
23
private void Page_Load(object sender, System.EventArgs e)
24
{
25
// 在此处放置用户代码以初始化页面
26
string m_strConn = "server=.;uid=sa;pwd=sa;database=Northwind";
27
SqlConnection conn = new SqlConnection(m_strConn);
28
29
try
30
{
31
conn.Open();
32
33
SqlCommand cmd = new SqlCommand("SELECT * FROM Employees",conn);
34
35
SqlDataAdapter adp = new SqlDataAdapter(cmd);
36
37
DataTable dt = new DataTable();
38
adp.Fill(dt);
39
40
this.DataGrid1.DataSource = dt;
41
this.DataGrid1.DataBind();
42
}
43
catch(Exception ex)
44
{
45
throw ex;
46
}
47
finally
48
{
49
conn.Close();
50
}
51
}
52
53
Web 窗体设计器生成的代码
74
75
/// <summary>
76
/// 创建Item
77
/// </summary>
78
/// <param name="sender"></param>
79
/// <param name="e"></param>
80
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
81
{
82
//将Item的呈现方法定向到自定义的呈现方法上
83
ListItemType lit = e.Item.ItemType;
84
if(ListItemType.Header == lit)
85
{
86
e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMethod));
87
}
88
}
89
90
/// <summary>
91
/// 自定义的Item呈现方法
92
/// </summary>
93
/// <param name="writer"></param>
94
/// <param name="ctl"></param>
95
private void NewRenderMethod(HtmlTextWriter writer,Control ctl)
96
{
97
//不需要从<TR>标签开始
98
//输出“联系电话”列
99
writer.Write("<TD colspan=\"3\" align=\"center\">联系电话</TD>\n");
100
101
//“地址”列必须有rowspan属性且必须在第一列呈现
102
TableCell cell = (TableCell)ctl.Controls[ctl.Controls.Count - 1];
103
cell.Attributes.Add("rowspan","2");
104
cell.RenderControl(writer);
105
106
//现在关闭第一行
107
writer.Write("</TR>\n");
108
109
//将设计时的样式属性添加到第二行使得两行的外观相似
110
this.DataGrid1.HeaderStyle.AddAttributesToRender(writer);
111
112
//插入第二行
113
writer.RenderBeginTag("TR");
114
115
//呈现除了最后一列(刚才已经呈现过了)外的所有在设计时定义的cells
116
for(int i=0;i<=ctl.Controls.Count-2;i++)
117
{
118
ctl.Controls[i].RenderControl(writer);
119
}
120
121
//不需要以</TR>结束
122
}
123
}
124
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

Feedback
刚才忘了,在测试例子中的DataGrid选择了Employees表中的四个字段
代码如下:
<asp:DataGrid id="DataGrid1" runat="server" Width="793px" Height="296px" AutoGenerateColumns="False"
BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4">
<SelectedItemStyle Font-Bold="True" ForeColor="#663399" BackColor="#FFCC66"></SelectedItemStyle>
<ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"></HeaderStyle>
<FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="LastName" HeaderText="办公电话"></asp:BoundColumn>
<asp:BoundColumn DataField="FirstName" HeaderText="住宅电话"></asp:BoundColumn>
<asp:BoundColumn DataField="HomePhone" HeaderText="移动电话"></asp:BoundColumn>
<asp:BoundColumn DataField="Address" HeaderText="联系地址"></asp:BoundColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="#330099" BackColor="#FFFFCC"></PagerStyle>
</asp:DataGrid>
代码如下:
<asp:DataGrid id="DataGrid1" runat="server" Width="793px" Height="296px" AutoGenerateColumns="False"
BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4">
<SelectedItemStyle Font-Bold="True" ForeColor="#663399" BackColor="#FFCC66"></SelectedItemStyle>
<ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"></HeaderStyle>
<FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="LastName" HeaderText="办公电话"></asp:BoundColumn>
<asp:BoundColumn DataField="FirstName" HeaderText="住宅电话"></asp:BoundColumn>
<asp:BoundColumn DataField="HomePhone" HeaderText="移动电话"></asp:BoundColumn>
<asp:BoundColumn DataField="Address" HeaderText="联系地址"></asp:BoundColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="#330099" BackColor="#FFFFCC"></PagerStyle>
</asp:DataGrid>
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 短信接口被刷爆:我用Nginx临时止血
· 聊聊智商税:AI知识库
· .NET 平台上的开源模型训练与推理进展
· Google发布A2A开源协议:“MCP+A2A”成未来标配?
· C# 多项目打包时如何将项目引用转为包依赖