动态创建 Web 服务器控件模板
由于各種原因,直到運行時,您可能才會知道需要什么模板或模板中應包含哪些文本或控件。在這種情況下,您需要能夠動態創建該模板(在代碼中)。
注意???您還可以將模板創建為 Web 窗體用戶控件,并將其動態綁定到頁上的控件。有關詳細信息,請參見創建模板用戶控件。在代碼中,您可以為所有使用模板的控件(DataList、Repeater 和 DataGrid 控件)創建模板。對于 DataGrid 控件,您要使用的是定義列的模板,而不是其他兩個控件的與行類似的模板。
注意???為 DataGrid 控件創建模板列時有一些差異。有關詳細信息,請參見在 DataGrid 控件中以編程方式創建模板。創建模板類
要創建動態模板,請創建以后需要時可實例化的模板類。
注意???有關在 Visual Basic .NET 中創建類的背景,請參見了解類。有關 Visual C# .NET 的類似信息,請參見 class。創建模板類
下面的示例說明完整的模板類,該類顯示某些靜態文本(“Item number:”)和計數器。計數器是類的名為 itemcount 的共享值或靜態值(根據您所用的語言),在每次創建新項時都會遞增。
該類定義一個接受 ListItemType 枚舉值以指示所創建模板類型的顯式構造函數。根據所創建的模板類型,代碼創建不同類型的控件并將其添加到父控件的 Controls 集合。最終結果是一個 HTML 表,其中的交替項模板具有不同的背景色。
復制' Visual Basic
Private Class MyTemplate
?? Implements ITemplate
?? Shared itemcount As Integer = 0
?? Dim TemplateType As ListItemType
?? Sub New(ByVal type As ListItemType)
????? TemplateType = type
?? End Sub
?? Sub InstantiateIn(ByVal container As Control) _
????? Implements ITemplate.InstantiateIn
????? Dim lc As New Literal()
????? Select Case TemplateType
???????? Case ListItemType.Header
??????????? lc.Text = "<TABLE border=1><TR><TH>Items</TH></TR>"
???????? Case ListItemType.Item
??????????? lc.Text = "<TR><TD>Item number: " & itemcount.ToString _
?????????????? & "</TD></TR>"
???????? Case ListItemType.AlternatingItem
??????????? lc.Text = "<TR><TD bgcolor=lightblue>Item number: " _
?????????????? & itemcount.ToString & "</TD></TR>"
???????? Case ListItemType.Footer
??????????? lc.Text = "</TABLE>"
????? End Select
????? container.Controls.Add(lc)
????? itemcount += 1
?? End Sub
End Class
// C#
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;
?? }
}
有了可用的動態模板,就可以在代碼中將其實例化了。
注意???若要將動態模板作為 DataGrid 控件中的列使用,請參見在 DataGrid 控件中以編程方式創建模板。創建動態模板
將該實例分配給 Repeater 控件或 DataList 控件的模板屬性之一:ItemTemplate、AlternatingItemTemplate、HeaderTemplate 等。
下面的示例顯示如何與 Repeater 控件一起使用動態模板。在此示例中,在加載頁時,而且是在控件綁定到數據源之前,將模板實例化。
復制' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
?? 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)
?? Repeater1.DataBind()
End Sub
// C#
private void Page_Load(object sender, System.EventArgs e)
{
?? 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);
?? Repeater1.DataBind();
}
根據創建類的方法,從模板類訪問數據的方式有多種。頁結構自行實現數據綁定是一種好方法,因為您給模板添加控件時,也會為這些控件的 DataBinding 事件添加處理程序。在創建了模板項及其所有控件后,將會引發此事件,這樣您就有機會獲取并在控件中使用數據。
注意???在模板中創建控件時,您不能像在設計時定義模板那樣,將數據綁定表達式作為字符串嵌入,因為數據綁定表達式會在頁處理階段(發生在創建您的模板之前)轉換為代碼。在 DataBinding 事件的處理程序中,您有機會操作控件的內容。通常(并非一定),您從某處獲取數據并將其分配給控件的 Text 屬性。
注意???有關 Web 窗體頁中數據綁定的背景信息,請參見 Web 窗體數據綁定。要將數據綁定添加到動態模板,必須執行如下操作:
- 將數據綁定事件處理程序添加到您在模板中創建的控件。
- 創建您要被綁定的處理程序。在該處理程序中,獲取您要被綁定的數據并將其分配給要被綁定控件的相應屬性。
添加數據綁定事件處理程序
- 在動態模板中創建控件后,使用標準命令將控件的 DataBinding 事件綁定到稍后您將創建的方法。 注意???有關如何動態添加事件處理程序的詳細信息,請參見 AddHandler 和 RemoveHandler(對于 Visual Basic)和事件教程(對于 Visual C#)。
下面的示例顯示了模板類中的代碼,該代碼闡釋了如何將新創建的控件綁定到名為 TemplateControl_DataBinding 的方法。
復制
' Visual Basic
Dim lc As New Literal()
?? Case ListItemType.Item
?? lc.Text = "<TR><TD>"
?? AddHandler lc.DataBinding, AddressOf TemplateControl_DataBinding
// C#
Literal lc = new Literal();
case ListItemType.Item:
?? lc.Text = "<TR><TD>";
?? lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
?? break;
- 請注意,此示例中您添加到文本控件的 Text 屬性的文本不同于上一示例。該示例只包含了項模板的表行和單元格的開頭。您將在數據綁定事件處理程序中填寫單元格和行。
下一步是創建事件處理程序,在控件處于數據綁定狀態時將調用該事件處理程序。
為 DataBinding 事件創建處理程序
' Visual Basic
Private Sub TemplateControl_DataBinding(ByVal sender As Object, _
?? ByVal e As System.EventArgs)
// C#
private void TemplateControl_DataBinding(object sender,
?? System.EventArgs e)
下面的代碼闡釋在動態模板內執行數據綁定的一種方式。它顯示了出在 Repeater 控件的模板中創建的 Literal 控件的完整數據綁定事件處理程序。
復制' Visual Basic
Private Sub TemplateControl_DataBinding(ByVal sender As Object, _
?? ByVal e As System.EventArgs)
?? Dim lc As Literal
?? lc = CType(sender, Literal)
?? Dim container As RepeaterItem
?? container = CType(lc.NamingContainer, RepeaterItem)
?? lc.Text &= DataBinder.Eval(container.DataItem, "CategoryName")
?? lc.Text &= "</TD></TR>"
End Sub
// C#
private void TemplateControl_DataBinding(object sender,
System.EventArgs e)
{
?? Literal lc;
?? lc = (Literal) sender;
?? RepeaterItem container = (RepeaterItem) lc.NamingContainer;
?? lc.Text += DataBinder.Eval(container.DataItem, "CategoryName");
?? lc.Text += "</TD></TR>";
}
轉載于:https://www.cnblogs.com/mcsm/articles/1832640.html
總結
以上是生活随笔為你收集整理的动态创建 Web 服务器控件模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件访问(三)
- 下一篇: 利用 LotusScript 灵活操作