动态创建DataGrid的模版列(转)

摘要:
有时我们需要绑定一个非常复杂的DataGrid。我们知道DataGrid、DataList和其他控件都有Template列。我们可以通过动态绑定模板列来绑定复杂的逻辑。我们使用InstantiateIn创建了一个LiteralControl控件,并向该控件添加了一个事件绑定事件,以便在绑定DataGrid时处理该控件。同时,为了实现事件绑定事件,我们还编写了事件处理函数OnDataBinding,在这里我们将使用指定的列来绑定数据。
有的时候我们需要邦定很复杂的DataGrid,我们知道DataGrid,DataList等控件都有Template列,我们可以通过动态的邦定模版列来实现,复杂逻辑的邦定。由于Page继承TemplateControl,所以在Page对象里面就可以使用TemplateControl类里面的方法LoadTemplate,我们可以利用这个方法加载指定路径用户控件来实现丰富的表示(顺便提一下还有一个LoadControl的方法和LoadTemplate有相同的参数类型,也就是说我们可以利用LoadControl方法动态的加载用户控件,可以实现自定义的用户界面,将页面元素分成一些小的用户控件可以根据用户的定义来加载),我们还可以实现Itemplate接口实现摸版列的动态邦定。

1、使用LoadTemplate实现:

       下面我们看一个例子,我们建立一个ASP.NET的Web应用程序,在添加一个ascx的用户控件叫webusercontrol1.ascx如下所示,该用户控件里面只有一个Label控件用来邦定一个Lastname字段:

<%@ Control Language="C#" %>

<asp:label ID="label1" Runat="server" text='<%# Databinder.Eval(((DataGridItem)Container).DataItem,"lastname")%>'></asp:label>

      接下来我们将要创建一个DataGrid控件DataGrid1,我们将在Page_Load事件里面添加如下的代码:

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");

ITemplate temp= Page.LoadTemplate("webusercontrol1.ascx");

TemplateColumn tc=new TemplateColumn();

tc.HeaderText = "Last Name";

tc.ItemTemplate = temp;

DataGrid1.Columns.Add(tc);

DataGrid1.DataSource = ds;

DataGrid1.DataMember = "employees";

DataGrid1.DataBind();

先面我们分析一下上面的代码,我们使用一个SQL Server里面自带的示例数据库Northwind。我们将得到所有的员工信息,然后填充数据集,然后我们声明一个Itemplate类型的对象temp用来装载邦定的用户控件。我们在声明一个TemplateColumn来动态创建一个模版列,接下来我们给该模版列添加信息,其中包括HeaderText等等,由于我们将要邦定的事ItemTemplate所以我们将刚才装载的temp赋值给该模版列的ItemTemplate对象,最后我们就将新的摸版列添加到DataGrid里面并邦定数据。

注意到上面过程,我们的用户控件里面有一个数据邦定的Label这个很重要,只有这样我们才能实现数据邦定的功能,否则就是显示一个有着相同信息的列。

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);)。 

上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。

原文http://www.mikecat.net/blogview.asp?logID=926&cateID=1

免责声明:文章转载自《动态创建DataGrid的模版列(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇2系统启动后的 wifi加载 过程图解WSGI学习系列eventlet.wsgi下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jQuery之自定义datagrid控件

sldatagrid 效果: sldatagrid.js 1 (function($) { 2 functionloadColumns(sldatagrid, columns) { 3 $(sldatagrid).empty(); 4 $(sldatagrid).append("<thead><tr>...

wpf研究之道——datagrid控件数据绑定

前台: <DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" > {binding} 是个简写的方式,绑定的是datagrid 对象的DataContext 后台: this.TestCaseDataGrid.DataContext = Data.PagerSource;...

[WPF](小结2)DataGrid嵌套DataGrid(也叫主从表)

DataGrid嵌套DataGrid(也叫主从表),效果为:单击表中某项后,从中间展开一个新表,总表绑定的是题目类大集合,从表绑定的是对应的选项集合. 第一:选构建题目类,再建一个选项类,题目类集合中的每个项包含一个选项类集合,即数组嵌套数组,C#语句如下: (为方便看清语句,类直接写在主程序中) C#代码如下: usingSystem; using...

easyui-combobox加载json中对象的属性---datagrid的数据

 这次做项目遇到了一个问题,在easyui-combobox加载json数据中对象的属性。后台返回的json中包含一个对象,而我想调用对象中的属性,后台返回的json如下: 1 { "rows": [ { "chances": [], "name": "系统管理员",...

EasyUi Datagrid中footer renderFooter

默认的'rowStyler' 选项不支持footer,想让footer支持rowStyler的话,dategird就得重写。代码如下。 var myview = $.extend({}, $.fn.datagrid.defaults.view, {     renderFooter: function(target, container, frozen){...

wpf研究之道——datagrid控件分页

datagrid控件分页效果,如下图所示: 上一页,下一页,可以跳到任何一页。当页码比较多的时候,只显示几页,其余用点点,界面实现如下: <!--分页--> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignm...