今天看到一篇文章,提出使用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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
54
override protected void OnInit(EventArgs e)
55
{
56
//
57
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
58
//
59
InitializeComponent();
60
base.OnInit(e);
61
}
62
63
/**//// <summary>
64
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
65
/// 此方法的内容。
66
/// </summary>
67
private void InitializeComponent()
68
{
69
this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);
70
this.Load += new System.EventHandler(this.Page_Load);
71
72
}
73
#endregion
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


54

55



56

57

58

59

60

61

62

63


64

65

66

67

68



69

70

71

72

73

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
