使用RenderMethod 委托实现DataGrid表头合并
今天看到一篇文章,提出使用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

支持TerryLee的创业产品Worktile
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)