有的時候我們需要邦定很複雜的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.dotnetbips.com網站