动态创建DataGrid的模版列(转)
生活随笔
收集整理的這篇文章主要介紹了
动态创建DataGrid的模版列(转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有的時(shí)候我們需要邦定很復(fù)雜的DataGrid,我們知道DataGrid,DataList等控件都有Template列,我們可以通過動(dòng)態(tài)的邦定模版列來實(shí)現(xiàn),復(fù)雜邏輯的邦定。由于Page繼承TemplateControl,所以在Page對象里面就可以使用TemplateControl類里面的方法LoadTemplate,我們可以利用這個(gè)方法加載指定路徑用戶控件來實(shí)現(xiàn)豐富的表示(順便提一下還有一個(gè)LoadControl的方法和LoadTemplate有相同的參數(shù)類型,也就是說我們可以利用LoadControl方法動(dòng)態(tài)的加載用戶控件,可以實(shí)現(xiàn)自定義的用戶界面,將頁面元素分成一些小的用戶控件可以根據(jù)用戶的定義來加載),我們還可以實(shí)現(xiàn)Itemplate接口實(shí)現(xiàn)摸版列的動(dòng)態(tài)邦定。
1、使用LoadTemplate實(shí)現(xiàn):
???????下面我們看一個(gè)例子,我們建立一個(gè)ASP.NET的Web應(yīng)用程序,在添加一個(gè)ascx的用戶控件叫webusercontrol1.ascx如下所示,該用戶控件里面只有一個(gè)Label控件用來邦定一個(gè)Lastname字段:
<%@?Control?Language="C#"?%>
<asp:label?ID="label1"?Runat="server"?text='<%#?Databinder.Eval(((DataGridItem)Container).DataItem,"lastname")%>'></asp:label>
??????接下來我們將要?jiǎng)?chuàng)建一個(gè)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();
先面我們分析一下上面的代碼,我們使用一個(gè)SQL?Server里面自帶的示例數(shù)據(jù)庫Northwind。我們將得到所有的員工信息,然后填充數(shù)據(jù)集,然后我們聲明一個(gè)Itemplate類型的對象temp用來裝載邦定的用戶控件。我們在聲明一個(gè)TemplateColumn來動(dòng)態(tài)創(chuàng)建一個(gè)模版列,接下來我們給該模版列添加信息,其中包括HeaderText等等,由于我們將要邦定的事ItemTemplate所以我們將剛才裝載的temp賦值給該模版列的ItemTemplate對象,最后我們就將新的摸版列添加到DataGrid里面并邦定數(shù)據(jù)。
注意到上面過程,我們的用戶控件里面有一個(gè)數(shù)據(jù)邦定的Label這個(gè)很重要,只有這樣我們才能實(shí)現(xiàn)數(shù)據(jù)邦定的功能,否則就是顯示一個(gè)有著相同信息的列。
2、使用Itemplate實(shí)現(xiàn):
上面我們使用LoadTemplate實(shí)現(xiàn)動(dòng)態(tài)摸版列的邦定,接下來我們將使用Itemplate接口來實(shí)現(xiàn)。Itemplate接口有一個(gè)方法InstantiateIn(Control?container)。這個(gè)方法必須指定摸版列的父親控件。下面的代碼將會(huì)實(shí)現(xiàn)Itemplate接口,我們使用下面的代碼創(chuàng)建一個(gè)新的類:
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;
???????}
???????//為了使用接口必須實(shí)現(xiàn)的方法
???????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();
???????}
}
}
在構(gòu)造函數(shù)里面我們?yōu)榘疃兄付肆忻N覀兪褂肐nstantiateIn創(chuàng)建了一個(gè)LiteralControl控件l,同時(shí)我們?yōu)檫@個(gè)控件添加事件邦定事件,這樣我們可以在邦定DataGrid的時(shí)候可以處理邦定這個(gè)控件,同時(shí)為了實(shí)現(xiàn)事件邦定事件,我們還編寫了事件處理函數(shù)OnDataBinding,在這里我們將用指定的列邦定數(shù)據(jù)。
接下來我們將我們的自定義的摸版列動(dòng)態(tài)的添加到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一個(gè)DataGrid出來,然后聲明一個(gè)模版列tc1,在設(shè)置tc1的ItemTemplate為我們自定一個(gè)模版列(不要忘了用列名這個(gè)參數(shù)),然后指定這個(gè)模版列的其他信息,最后利用DataSet邦定數(shù)據(jù)(不要忘了將控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。?
上面介紹了兩種動(dòng)態(tài)邦定模版列的方法,希望可以對初學(xué)者有所幫助,其實(shí)這里的方法是很簡單的,我想這里最關(guān)鍵的問題是如何理解面向?qū)ο?#xff0c;希望通過這篇文章的描述初學(xué)者可以對面向?qū)ο笥懈玫睦斫?#xff0c;我們這里使用了接口的繼承以及父類子類之間的關(guān)系,通過使用接口的繼承我們可以制作一個(gè)模版列的工廠可以使用同一種模式產(chǎn)生不同的模版列,因?yàn)槲覀兪褂玫氖墙涌?#xff08;詳細(xì)信息請見《設(shè)計(jì)模式》)。
原文http://www.mikecat.net/blogview.asp?logID=926&cateID=1
1、使用LoadTemplate實(shí)現(xiàn):
???????下面我們看一個(gè)例子,我們建立一個(gè)ASP.NET的Web應(yīng)用程序,在添加一個(gè)ascx的用戶控件叫webusercontrol1.ascx如下所示,該用戶控件里面只有一個(gè)Label控件用來邦定一個(gè)Lastname字段:
<%@?Control?Language="C#"?%>
<asp:label?ID="label1"?Runat="server"?text='<%#?Databinder.Eval(((DataGridItem)Container).DataItem,"lastname")%>'></asp:label>
??????接下來我們將要?jiǎng)?chuàng)建一個(gè)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();
先面我們分析一下上面的代碼,我們使用一個(gè)SQL?Server里面自帶的示例數(shù)據(jù)庫Northwind。我們將得到所有的員工信息,然后填充數(shù)據(jù)集,然后我們聲明一個(gè)Itemplate類型的對象temp用來裝載邦定的用戶控件。我們在聲明一個(gè)TemplateColumn來動(dòng)態(tài)創(chuàng)建一個(gè)模版列,接下來我們給該模版列添加信息,其中包括HeaderText等等,由于我們將要邦定的事ItemTemplate所以我們將剛才裝載的temp賦值給該模版列的ItemTemplate對象,最后我們就將新的摸版列添加到DataGrid里面并邦定數(shù)據(jù)。
注意到上面過程,我們的用戶控件里面有一個(gè)數(shù)據(jù)邦定的Label這個(gè)很重要,只有這樣我們才能實(shí)現(xiàn)數(shù)據(jù)邦定的功能,否則就是顯示一個(gè)有著相同信息的列。
2、使用Itemplate實(shí)現(xiàn):
上面我們使用LoadTemplate實(shí)現(xiàn)動(dòng)態(tài)摸版列的邦定,接下來我們將使用Itemplate接口來實(shí)現(xiàn)。Itemplate接口有一個(gè)方法InstantiateIn(Control?container)。這個(gè)方法必須指定摸版列的父親控件。下面的代碼將會(huì)實(shí)現(xiàn)Itemplate接口,我們使用下面的代碼創(chuàng)建一個(gè)新的類:
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;
???????}
???????//為了使用接口必須實(shí)現(xiàn)的方法
???????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();
???????}
}
}
在構(gòu)造函數(shù)里面我們?yōu)榘疃兄付肆忻N覀兪褂肐nstantiateIn創(chuàng)建了一個(gè)LiteralControl控件l,同時(shí)我們?yōu)檫@個(gè)控件添加事件邦定事件,這樣我們可以在邦定DataGrid的時(shí)候可以處理邦定這個(gè)控件,同時(shí)為了實(shí)現(xiàn)事件邦定事件,我們還編寫了事件處理函數(shù)OnDataBinding,在這里我們將用指定的列邦定數(shù)據(jù)。
接下來我們將我們的自定義的摸版列動(dòng)態(tài)的添加到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一個(gè)DataGrid出來,然后聲明一個(gè)模版列tc1,在設(shè)置tc1的ItemTemplate為我們自定一個(gè)模版列(不要忘了用列名這個(gè)參數(shù)),然后指定這個(gè)模版列的其他信息,最后利用DataSet邦定數(shù)據(jù)(不要忘了將控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。?
上面介紹了兩種動(dòng)態(tài)邦定模版列的方法,希望可以對初學(xué)者有所幫助,其實(shí)這里的方法是很簡單的,我想這里最關(guān)鍵的問題是如何理解面向?qū)ο?#xff0c;希望通過這篇文章的描述初學(xué)者可以對面向?qū)ο笥懈玫睦斫?#xff0c;我們這里使用了接口的繼承以及父類子類之間的關(guān)系,通過使用接口的繼承我們可以制作一個(gè)模版列的工廠可以使用同一種模式產(chǎn)生不同的模版列,因?yàn)槲覀兪褂玫氖墙涌?#xff08;詳細(xì)信息請見《設(shè)計(jì)模式》)。
原文http://www.mikecat.net/blogview.asp?logID=926&cateID=1
轉(zhuǎn)載于:https://www.cnblogs.com/dagon007/archive/2005/03/10/116217.html
總結(jié)
以上是生活随笔為你收集整理的动态创建DataGrid的模版列(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML指令 入门
- 下一篇: asp.net和javascript怎样