动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
要創(chuàng)建動態(tài)模板,請創(chuàng)建以后需要時可實例化的模板類。
創(chuàng)建模板類
創(chuàng)建實現(xiàn)?System.Web.UI.ITemplate?接口的新類。
您也可以將值傳遞到類的構(gòu)造函數(shù),類可以使用該值來確定要創(chuàng)建的模板類型(ItemTemplate、AlternatingItemTemplate?
| 將模板類型傳遞到構(gòu)造函數(shù)的類型安全方法是向構(gòu)造函數(shù)添加類型為?ListItemType?的參數(shù)。ListItemType 枚舉為 Repeater、DataList 和其他控件定義可能的模板類型。 |
在類中,實現(xiàn)?InstantiateIn?方法,該方法是 ITemplate 接口的成員。
此方法提供將文本實例和控件實例插入指定容器的方法。
在 InstantiateIn 方法中,為模板項創(chuàng)建控件,設(shè)置其屬性,然后將它們添加到父級的 Controls 集合。
您可以通過傳遞到 InstantiateIn 方法的引用訪問父控件。
| 不能直接向 Controls 集合添加靜態(tài)文本,但可以創(chuàng)建類似?Literal?控件或?LiteralControl?控件的控件,設(shè)置它們的 Text 屬性,然后向父集合添加這些控件。 |
下面的代碼示例闡釋完整的模板類,該類顯示某些靜態(tài)文本(“Item number:”)和計數(shù)器。計數(shù)器是名為?itemcount?的靜態(tài)值(在 Visual Basic 中為共享值),在每次創(chuàng)建新項時都會遞增。該類定義一個接受 ListItemType 枚舉值以指示所創(chuàng)建模板類型的顯式構(gòu)造函數(shù)。根據(jù)所創(chuàng)建的模板類型,代碼創(chuàng)建不同類型的控件并將其添加到父控件的 Controls 集合。最終結(jié)果是一個 HTML 表,其中的交替項模板具有不同的背景色。
public class MyTemplate : ITemplate {static int itemcount = 0;ListItemType templateType;public MyTemplate(ListItemType type){templateType = type;}public void InstantiateIn(System.Web.UI.Control container){Literal lc = new Literal();switch (templateType){case ListItemType.Header:lc.Text = "<TABLE border=1><TR><TH>Items</TH></TR>";break;case ListItemType.Item:lc.Text = "<TR><TD>Item number: " + itemcount.ToString() +"</TD></TR>";break;case ListItemType.AlternatingItem:lc.Text = "<TR><TD bgcolor=lightblue>Item number: " +itemcount.ToString() + "</TD></TR>";break;case ListItemType.Footer:lc.Text = "</TABLE>";break;}container.Controls.Add(lc);itemcount += 1;} }使用動態(tài)模板
有了可用的動態(tài)模板,就可以在代碼中將其實例化了。
創(chuàng)建動態(tài)模板
創(chuàng)建動態(tài)模板的實例,如果合適的話,將一個項類型值傳遞給它。
將該實例分配給模板化控件的模板屬性之一,如 ItemTemplate、AlternatingItemTemplate 和 HeaderTemplate 屬性。
下面的代碼示例演示如何與 Repeater 控件一起使用動態(tài)模板。在此示例中,在加載頁時,而且是在控件綁定到數(shù)據(jù)源之前,將模板實例化。
private void Page_Load(object sender, System.EventArgs e) {SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);SqlDataAdapter sqlDataAdapter1;DataSet dsCategories1;sqlDataAdapter1 = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", conn);dsCategories1 = new DataSet();Repeater1.HeaderTemplate = new MyTemplate(ListItemType.Header);Repeater1.ItemTemplate = new MyTemplate(ListItemType.Item);Repeater1.AlternatingItemTemplate =new MyTemplate(ListItemType.AlternatingItem);Repeater1.FooterTemplate = new MyTemplate(ListItemType.Footer);sqlDataAdapter1.Fill(dsCategories1, "Categories");Repeater1.DataSource = dsCategories1.Tables["Categories"];Repeater1.DataBind(); }要將數(shù)據(jù)綁定添加到動態(tài)模板,必須執(zhí)行如下操作:
-
將數(shù)據(jù)綁定事件處理程序添加到您在模板中創(chuàng)建的控件。
-
創(chuàng)建您要被綁定的處理程序。在該處理程序中,獲取您要被綁定的數(shù)據(jù)并將其分配給要被綁定控件的相應(yīng)屬性。
添加數(shù)據(jù)綁定事件處理程序
-
在動態(tài)模板中創(chuàng)建控件后,添加對控件的 DataBinding 事件的事件處理程序的引用。(接下來您將創(chuàng)建事件處理程序)。
下面的代碼示例演示了模板類的一部分,該部分闡釋了如何將新創(chuàng)建的控件綁定到名為?TemplateControl_DataBinding?的方法:
?
case?ListItemType.Item:
??
lc.Text?=?"<TR><TD>";
lc.DataBinding?+=?new?EventHandler(TemplateControl_DataBinding);
break;
在上例中,您添加到文本控件的 Text 屬性的文本不同于前一示例。該示例只包含了項模板的表行和單元格的開頭。您將在數(shù)據(jù)綁定事件處理程序中填寫單元格和行。
下一步是創(chuàng)建事件處理程序,在控件處于數(shù)據(jù)綁定狀態(tài)時將調(diào)用該事件處理程序。
二、在我自己的項目中使用的控件是GridView,動態(tài)模板列中使用的是LinkButton控件,創(chuàng)建的過程大概與上面相同,如下:
創(chuàng)建模板類?
public class GaugeValueTemplate : ITemplate{#region ITemplate 成員public void InstantiateIn(Control container){LinkButton lbGaugeMakeValue = new LinkButton();lbGaugeMakeValue.ID = "LB_GaugeMakeValue";lbGaugeMakeValue.DataBinding += new EventHandler(lbGaugeMakeValue_DataBinding);lbGaugeMakeValue.CommandName = "GaugeMakeValue";container.Controls.Add(lbGaugeMakeValue);}void lbGaugeMakeValue_DataBinding(object sender, EventArgs e){LinkButton lbGaugeMakeValue = (LinkButton)sender;GridViewRow container = (GridViewRow)lbGaugeMakeValue.NamingContainer;//綁定GaugeMakeValue字段的值lbGaugeMakeValue.Text = DataBinder.Eval(container.DataItem, "GaugeMakeValue").ToString();}使用模板?
TemplateField GaugeMakeValueColumn = new TemplateField();GaugeMakeValueColumn.HeaderText = "指標(biāo)制定值";GaugeMakeValueColumn.ItemTemplate = new GaugeValueTemplate();從這里可以看出GridView與Repeater控件中的區(qū)別在于:
Repeater:RepeaerItem container = (RepeaterItem)lc.NamingContainer;
??? lc.Text += DataBinder.Eval(container.DataItem, "CategoryName");
GridView:GridViewRow?container?=?(GridViewRow)lbGaugeMakeValue.NamingContainer;
???????????//綁定GaugeMakeValue字段的值
???????????lbGaugeMakeValue.Text?=?DataBinder.Eval(container.DataItem,?"GaugeMakeValue").ToString();
三、關(guān)于DataGrid的方法,可參見http://www.cnblogs.com/lovecherry/archive/2005/03/25/125526.html
?
為 DataBinding 事件創(chuàng)建處理程序
創(chuàng)建屬于模板類的方法,它還是該類的其他方法(如 InstantiateIn)的對等方法。處理程序的名稱必須與早期綁定事件時使用的名稱相匹配。該方法應(yīng)該具有以下簽名:
private?void?TemplateControl_DataBinding(object?sender,System.EventArgs?e)
?
通過執(zhí)行以下操作獲取對包含數(shù)據(jù)的 DataItem 對象的引用:
獲取對模板項的引用。創(chuàng)建變量來保存該引用,然后將從控件的?NamingContainer?屬性獲取的值分配給它。
使用該引用來獲取命名容器的(模板項的)DataItem?屬性。
從 DataItem 對象提取單個數(shù)據(jù)元素(例如數(shù)據(jù)列),并使用它來設(shè)置您要綁定的控件的屬性。
下面的代碼示例闡釋在動態(tài)模板內(nèi)執(zhí)行數(shù)據(jù)綁定的一種方式。它演示了在 Repeater 控件的模板中創(chuàng)建的 Literal 控件的完整數(shù)據(jù)綁定事件處理程序。
以上文章參考http://www.cnblogs.com/50614090/archive/2011/08/19/2145399.html
http://www.cnblogs.com/guiliangfeng/archive/2009/04/19/1439235.html
?
總結(jié)
以上是生活随笔為你收集整理的动态创建模板列并绑定数据(GridView,Repeater,DataGrid)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “2012年度IT博客大赛”获奖感言--
- 下一篇: java学习步骤