xiyurui

路靠自己走,也靠运气. 但能不能抓住运气靠自己的手. 所以.自己的手和自己的脚,是最值得依赖的. 少壮不努力,老大徒伤悲!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
随笔 - 66, 文章 - 0, 评论 - 30, 阅读 - 43713
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年4月 >
30 31 1 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 1 2 3
4 5 6 7 8 9 10

使用RenderMethod 委托实现DataGrid表头合并

Posted on   晰雨的天空  阅读(851)  评论(0编辑  收藏  举报

今天看到一篇文章,提出使用RenderMethod委托可以实现DataGrid表头的合并。自己测试了一下,效果不错,把DataGrid的表头转化为用Table来控制,就可以随心所欲了。可能前面有人用这种方法是实现过,但是我还是把代码贴上来,大家分享一下

  1using System;
  2using System.Collections;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Web;
  7using System.Web.SessionState;
  8using System.Web.UI;
  9using System.Web.UI.WebControls;
 10using System.Web.UI.HtmlControls;
 11using System.Data.SqlClient;
 12
 13namespace 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}

Feedback

# re: 使用RenderMethod 委托实现DataGrid表头合并   

2005-09-29 14:20 by Terrylee
刚才忘了,在测试例子中的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>
编辑推荐:
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
阅读排行:
· 短信接口被刷爆:我用Nginx临时止血
· 聊聊智商税:AI知识库
· .NET 平台上的开源模型训练与推理进展
· Google发布A2A开源协议:“MCP+A2A”成未来标配?
· C# 多项目打包时如何将项目引用转为包依赖
点击右上角即可分享
微信分享提示