GridView中动态生成ItemTemplate模板列

转载 2011年01月11日 13:35:00

我们知道DataGrid,DataList等控件都有Template列,我们可以通过动态的邦定模版列来实现,复杂逻辑的邦定。由于Page继承TemplateControl,所以在Page对象里面就可以使用TemplateControl类里面的方法LoadTemplate,我们可以利用这个方法加载指定路径用户控件来实现丰富的表示(顺便提一下还有一个LoadControl的方法和LoadTemplate有相同的参数类型,也就是说我们可以利用LoadControl方法动态的加载用户控件,可以实现自定义的用户界面,将页面元素分成一些小的用户控件可以根据用户的定义来加载),我们还可以实现Itemplate接口实现摸版列的动态邦定。

1、使用LoadTemplate实现:
ITemplate temp= Page.LoadTemplate("control1.ascx");
TemplateColumn tc=new TemplateColumn();
tc.HeaderText = "Last Name";
tc.ItemTemplate = temp;
GridView1.Columns.Add(tc);
GridView1.DataSource = ds;
GridView1.DataMember = "title";
GridView1.DataBind();

我们声明一个Itemplate类型的对象temp用来装载邦定的用户控件。我们在声明一个TemplateColumn来动态创建一个模版列,接下来我们给该模版列添加信息,其中包括HeaderText等等,由于我们将要邦定的事ItemTemplate所以我们将刚才装载的temp赋值给该模版列的ItemTemplate对象,最后我们就将新的摸版列添加到GridView里面并邦定数据。

2、使用Itemplate实现:

上面我们使用LoadTemplate实现动态摸版列的邦定,接下来我们将使用Itemplate接口来实现。Itemplate接口有一个方法InstantiateIn(Control container)。这个方法必须指定摸版列的父亲控件。下面的代码将会实现Itemplate接口,我们使用下面的代码创建一个新的类:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace DynamicDataGridTemplates{
public class CTemplateColumn:ITemplate{
       private string colname;
       public CTemplateColumn(string cname){
              colname=cname;
       }
       //为了使用接口必须实现的方法
       public void InstantiateIn(Control container)       {
              LiteralControl l = new LiteralControl();
              l.DataBinding += new EventHandler(this.OnDataBinding);
              container.Controls.Add(l);
       }
       public void OnDataBinding(object sender, EventArgs e){
              LiteralControl l = (LiteralControl) sender;
              DataGridItem container = (DataGridItem) l.NamingContainer;
              l.Text = ((DataRowView)       container.DataItem)[colname].ToString();
       }
}
}
在构造函数里面我们为邦定列指定了列名。我们使用InstantiateIn创建了一个LiteralControl控件l,同我们为这个控件添加事件邦定事件,这样我们可以在邦定DataGrid的时候可以处理邦定这个控件,同时为了实现事件邦定事件,我们还编写了事件处理函数OnDataBinding,在这里我们将用指定的列邦定数据。
接下来我们将我们的自定义的摸版列动态的添加到DataGrid里面,如下的代码是Page_Load里面的:
DataGrid datagrid1=new DataGrid();
TemplateColumn tc1=new TemplateColumn();
tc1.ItemTemplate=new CTemplateColumn("lastname");
tc1.HeaderText="Last Name";
datagrid1.Columns.Add(tc1);
Page.Controls[1].Controls.Add(datagrid1);
string connstr = @"Integrated Security=SSPI;User ID=sa;Initial
Catalog=Northwind;Data Source=MyServer/NetSDK";
SqlConnection cnn=new SqlConnection(connstr);
SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn)
DataSet ds=new DataSet();
da.Fill(ds, "employees");
datagrid1.DataSource = ds;
datagrid1.DataMember = "employees";
datagrid1.DataBind();
首先我们New一个DataGrid出来,然后声明一个模版列tc1,在设置tc1的ItemTemplate为我们自定一个模版列(不要忘了用列名这个参数),然后指定这个模版列的其他信息,最后利用DataSet邦定数据(不要忘了将控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。
上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。

GridView中TemplateField的使用

BoundField只能显示一个单独的数据字段。如果我们想要在一个GridView列中显示两个或者更多的数据字段的值的时候该怎么办呢?1. GridView的一列同时显示数据源中的两个字段      ...
  • feixiang7443
  • feixiang7443
  • 2010年04月29日 11:42
  • 17611

GridView中动态添加模板列和其子控件集合

一、实施说明: 1 实施原因: 因为在做一个MOSS WebPart控件时候,遇到一个问题,如何选择需要导出的数据列; GridView的数据源是动态的,所以没有办法静态使用模板列,...
  • y29508968
  • y29508968
  • 2016年12月04日 11:09
  • 865

后台动态生成GridView列和模版

考虑到很多数据源是不确定的,所以这时无法在前台设置gridview的表头,需要在后台动态指定并绑定数据。 前台代码如下: "主页" Language="C#" MasterPageFi...
  • hwt0101
  • hwt0101
  • 2014年06月11日 11:29
  • 1702

Asp.net动态添加GridView列

Asp.net动态添加GridView列,列中的控件可以任意指定一个或多个。 比使用一般的Table控件,更加的灵活,且能够很多的支持数据的绑定操作。 下面给出了一个示例。 1. 首先是指定动态...
  • w1491413492
  • w1491413492
  • 2016年04月10日 11:23
  • 363

完美解决GridView的item重叠问题

完美解决GridView的item重叠问题作者:周文豪前言,在项目开发中,使用了GridView来做两列显示的需求,item是textview,但是内容未知,可长可短。于是乎,遇到了一个bug,如下图...
  • zhouwenhao201
  • zhouwenhao201
  • 2017年06月28日 22:30
  • 1665

AspxGridView学习日记--动态添加超链接列

AspxGridView学习日记--动态添加超链接列                分类:            ASP.NETC#2008-05-29 17:054953人阅读评论(4)收藏...
  • kirawoo
  • kirawoo
  • 2015年06月15日 13:13
  • 2066

GridView动态创建列、多行表头

一、动态创建列: // 创建GridView列的方法 private void CreateGridColumn( string dataField, string headerTex...
  • jumtre
  • jumtre
  • 2014年08月13日 11:35
  • 3515

GridView超链接字段的URL编码方法

今天升级一个老程序,其中有段代码感觉很奇怪,虽然是自己写的,但时间长了一时也记不得当时的想法。仔细看了看明白是为了解决URL编码问题采取的变通方法,鉴于当时的经验倒也可以理解。问题简单描述如下:在Gr...
  • gaofeng2000
  • gaofeng2000
  • 2015年06月18日 14:08
  • 1194

GridView动态添加模板列

转自:http://blog.csdn.net/Sandy945/article/details/4397142
  • wljhk2006
  • wljhk2006
  • 2014年04月29日 16:24
  • 482

excel导出模板实现动态封装字段【工具包系列】

excel导入导出的功能现在在后台管理的系统中越来越常见,比如导出学生信息、导出商品的信息。但是并不是每次导出都使用所 有的字段,可能是用户自定义导出字段,所以这时候就需要个性化导出设置配置。    ...
  • LOVELONG8808
  • LOVELONG8808
  • 2016年08月08日 15:05
  • 2447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GridView中动态生成ItemTemplate模板列
举报原因:
原因补充:

(最多只允许输入30个字)