需求说明:在DataGrid中显示手机短信过滤类型(手机号码,业务推广短信,帐户变动短信,节日祝福短信),表示是否向手机号码相应类型的短信。由于被过滤的短信类型可能会动态添加,因此绑定DataGrid时只能通过后台动态绑定,以便增加短信类型时不用修改aspx页面。下图是示例的显示效果,只要在获取数据时增加“节日祝福”列,页面不需要做任何修改,显示就由左图内容变成右图内容。

    

实现过程:下面用代码说明具体实现。
      1.aspx页面部分,代码很简单,在页面中放一个DataGrid就可以了。

 <form id="form1" runat="server">
        <div>
            <asp:DataGrid ID="dgSmsFilters" Style="z-index: 101; left: 264px; position: absolute;
                top: 152px" runat="server" Width="480px" Height="200px" AutoGenerateColumns="False"
                BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White"
                CellPadding="4">
                <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99" BackColor="#009999"></SelectedItemStyle>
                <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
                <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF" BackColor="#003399"></HeaderStyle>
                <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
                <PagerStyle HorizontalAlign="Left" ForeColor="#003399" BackColor="#99CCCC" Mode="NumericPages">
                </PagerStyle>
            </asp:DataGrid>
        </div>
    </form>

2.aspx.cs后台代码部分,这部分的作用就是准备好数据,并绑定到DataGrid中。我们注意到给模板列赋值时实例化了ColumnTemplate类。这个类是我们自己定义的类,也是后台绑定模板列的核心所在,第三部分代码将演示这个类的实现。

protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    this.BindGrid();
                }
            }


            //准备示例数据
            private DataTable GetDates()
            {
                DataTable dtSmsFilters = new DataTable("dtSmsFilters");
                DataColumn dcSmsNum = new DataColumn("手机号",Type.GetType("System.String"));
                dtSmsFilters.Columns.Add(dcSmsNum);
                //产生短信过滤类型,实际应根据数据库中内容动态生成的,列数可以动态添加
                DataColumn dcSmsFilterType1 = new DataColumn("业务推广",Type.GetType("System.Boolean"));
                dtSmsFilters.Columns.Add(dcSmsFilterType1);
                DataColumn dcSmsFilterType2 = new DataColumn("帐户变动",Type.GetType("System.Boolean"));
                dtSmsFilters.Columns.Add(dcSmsFilterType2);
                DataColumn dcSmsFilterType3 = new DataColumn("节日祝福", Type.GetType("System.Boolean"));
                dtSmsFilters.Columns.Add(dcSmsFilterType3);
                //手动添加测试数据
                DataRow dr;
                for(int i=0;i<10;i++)
                {
                    //赋值,无实际意义,只为显示
                    dr = dtSmsFilters.NewRow();
                    dr[0] = "1366666888"+i.ToString();
                    dr[1] = i%2==0?true:false;
                    dr[2] = i % 3 == 0 ? true : false;
                    dr[3] = i % 4 == 0 ? true : false;
                    dtSmsFilters.Rows.Add(dr);
                }
                return dtSmsFilters;
            }


            //绑定DataGrid
            private void BindGrid()
            {
                DataTable dt = this.GetDates();
                this.dgSmsFilters.DataSource = dt;

                //添加绑定列,绑定手机号
                BoundColumn bc = new BoundColumn();
                bc.HeaderText = dt.Columns[0].ColumnName;
                bc.DataField = dt.Columns[0].ColumnName;
                this.dgSmsFilters.Columns.AddAt(0,bc);

                //添加模板列,绑定过滤短信类型,模板列的列数是由函数GetDates()生成的DataTable的列数决定的
                for(int i=1;i<dt.Columns.Count;i++)
                {
                    TemplateColumn tc = new TemplateColumn();
                    tc.HeaderText = dt.Columns[i].ColumnName;
                    tc.ItemTemplate = new ColumnTemplate("ckb"+i.ToString(),dt.Columns[i].ColumnName);
                    this.dgSmsFilters.Columns.AddAt(i,tc);
                }
                this.dgSmsFilters.DataBind();
            }

3.ColumnTemplate类的实现。继承自ITemplate接口,并实现了接口方法InstantiateIn(),定义子控件和模板所属的 Control 对象。

 //ColumnTemplate 从ITemplate继承。
        //InstantiateIn 定义子控件的属于谁
        public class ColumnTemplate:System.Web.UI.ITemplate
        {
            string id;
            string bindField;

            public ColumnTemplate(string id,string bindField)
            {
                this.id = id;
                this.bindField = bindField; 
            }

            //Override the ITemplate.InstantiateIn method to ensure 
            //that the templates are created in a CheckBox control and
            //that the CheckBox object's DataBinding event is associated
            //with the BindData method.
            public void InstantiateIn(Control container)
            {
                CheckBox ckb = new CheckBox();
                ckb.ID = this.id;
                ckb.DataBinding += new EventHandler(this.BindData);
                container.Controls.Add(ckb);
            }

            //Create a public method that will handle the
            //DataBinding event called in the InstantiateIn method.
            public void BindData(object sender, EventArgs e)
            {
                CheckBox ckb = (CheckBox) sender;
                DataGridItem container = (DataGridItem) ckb.NamingContainer;
                string isFilter = ((DataRowView) container.DataItem)[bindField].ToString();  
                ckb.Checked = bool.Parse(isFilter);
            }
        }

源代码下载地址: 点击下载完整示例程序 (示例路径:/WebControls/TemplateColumnDemo.aspx)

DataGrid动态绑定模板列相关推荐

  1. Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果

    Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果 转载于:https://www.cnblogs.com/K ...

  2. ASP.NET DEMO 14: 如何在 GridView/DataGrid 模板列中使用自动回发的 CheckBox/DropDownList

    有时候希望在 GridView 模板中使用自动回发的 CheckBox (autopostback=true) ,但是 CheckBox 没有 CommandName 属性,因此也就无法在 GridV ...

  3. ASP.NET基础教程-DataGrid表格控件-模板列的使用

    一.给表格添加一个模板列,在查板列中添加一个文本框,文本框名字为"txt" 1.对文本框进行赋值: ((TextBox)DataGrid.Items[0].Cells[0].Fin ...

  4. RadioButton加入DataGrid模板列引起的问题。

    也许各位看官还尚未注意到,将RadioButton加入到DataGrid模板列后(当然DataList,Repeater也一样),尽管你设置了其GroupName,结果还是不能实现我们想要的效果, 即 ...

  5. 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)

    要创建动态模板,请创建以后需要时可实例化的模板类. 创建模板类 创建实现 System.Web.UI.ITemplate 接口的新类. 您也可以将值传递到类的构造函数,类可以使用该值来确定要创建的模板 ...

  6. 怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列

    昨天被问到一个问题:怎么把WinForms里的DataGrid的绑定了数据库bit字段的列默认显示的CheckBox换成"男"和"女",也就是说怎么样像ASP. ...

  7. gridview中动态绑定通过模板列增加的textbox。

    首先 我想 实现的就是,通过gridview中模板列增加个textbox,并且从数据库中查出来这列值,然后绑定到textbox上. 下面是我实现的效果(毁损时间 就是我的那个列,下面就是我显示出来的时 ...

  8. 使用DataGrid动态绑定DropDownList

    简单的使用模板列绑定DropDownList,初学者想必都会了,但有时候,我们要做的就是在编辑的时候想让某一列定制为DropDownList,并且根据正常情况下显示的值自动变换DropDownList ...

  9. asp.net中显示DataGrid控件列序号的几种方法

    在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值 ...

最新文章

  1. 交换机与路由器大战已结束,超大规模计算公司胜出
  2. 2020暑期实习后台开发字节跳动笔试
  3. jq实现跳转404跳转,原生js实现跳转404跳转
  4. C代码开发遇到的问题 变量初始化和结构体指针移动
  5. 【设备】WIN10怎么用佳能LIDE120扫描仪?
  6. Anaconda配置的环境里面增加第三方库的方法
  7. Nginx学习之十二-负载均衡-加权轮询策略剖析
  8. 多线程调用同一个对象的方法_这一次,让我们完全掌握Java多线程(2/10)
  9. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)...
  10. Spark集群资源如何分配
  11. 2.5.PHP7.1 狐教程-【数据类型】
  12. 【狂神说Redis】4 三种特殊数据类型
  13. 06 - 雷达发射机 概述
  14. 【Redis 开发与运维】初识 Redis
  15. 帝国 cms 列表 php,帝国cms数据表详细中文说明
  16. 论文投稿指南——中国(中文EI)期刊推荐(第4期)
  17. XSSFWorkbook 设置单元格样式_CVA高校精英计划第二弹:执行最佳操作,做好设置准备...
  18. 出现network boot from intel e1000问题的解决办法
  19. 《Python程序设计》实验四 Python综合实践实验报告
  20. 有名管道----mkfifo函数的使用

热门文章

  1. ActiveMQ_使用经验
  2. mysql xtrabackup-v2_pxc wsrep_sst_method均配置为xtrabackup-v2报错
  3. 孕妇可以使用计算机,【电脑对孕妇有影响吗】电脑对孕妇的危害,孕妇能玩电脑吗 - 妈妈网百科...
  4. 计算机科学与技术专业的课程体系,基于业务的计算机科学与技术专业课程体系...
  5. java buffer 记事本_Java实现记事本|IO流/GUI
  6. zookeeper的设计猜想-集群组成
  7. 多线程对于共享变量访问带来的安全性问题
  8. MyBatis 插件原理与自定义插件-需求实现
  9. 反射获取成员方法并使用【应用】
  10. SpringCloud(Gateway网关跨域)