VS2005 GridView
模版类
public class GridViewTemplate : ITemplate
{
//private DataControlRowType templateType;
//private string columnName;
ListItemType templateType;
string columnName;
//public GridViewTemplate(DataControlRowType type, string colname)
public GridViewTemplate(ListItemType type, string colname)
{
templateType = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case ListItemType.Header:
//lc.Text = "<B>" + columnName + "</B>";
//container.Controls.Add(lc);
break;
case ListItemType.Item:
Table Table1 = new Table();
Table1.ID = "Table1";
container.Controls.Add(Table1);
//DropDownList drr = new DropDownList();
//drr.ID = "dropdown";
//drr.AppendDataBoundItems = true;
//drr.Items.Add(new ListItem("-----请选择------", ""));
//drr.Items.Add(new ListItem("AA", "a"));
//drr.Items.Add(new ListItem("BB", "b"));
//drr.Items.Add(new ListItem("CC", "c"));
//container.Controls.Add(drr);
break;
case ListItemType.EditItem:
//TextBox tb = new TextBox();
//tb.Text = "";
//container.Controls.Add(tb);
break;
case ListItemType.Footer:
//lc.Text = "<I>" + columnName + "</I>";
//container.Controls.Add(lc);
break;
}
}
}
private void Page_Load(object sender, System.EventArgs e)
{
TemplateField field = new TemplateField();
field.HeaderStyle.Wrap = false;
field.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
field.HeaderText = tab.Rows[0]["show_name"].ToString();
//field.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "");
field.ItemTemplate = new GridViewTemplate(ListItemType.Item, "");
this.GridView1.Columns.Add(field);
}
msdn帮助
DataGrid 控件可以包含模板列,在该模板列中,您可以通过添加控件和文本来布局列。与绑定列、按钮列和超级链接列相比,模板列提供了更大的灵活性。正如 DataList 控件和 Repeater 控件的模板一样,您可以动态创建 DataGrid 控件的模板,从而可以在运行时定义列的内容、布局和数据。
注意 使用动态模板列的过程与在 Repeater 控件或 DataList 控件中使用动态模板的过程类似。有关创建动态模板的一般信息,请参见动态创建 Web 服务器控件模板。
下面是在 DataGrid 控件中使用动态模板与在 Repeater 或 DataList 控件中使用动态模板的区别:
请不要为网格本身创建项模板,而是为网格中的列创建项模板。
DataGrid 列的模板与 Repeater 或 DataList 控件的模板稍有不同。DataGrid 列不包括交替项或分隔符模板。但是,与 DataList 控件类似,DataGrid 列确实包括 EditItem 模板。
创建动态模板列
创建实现 System.Web.UI 命名空间的 ITemplate 接口的模板类。有关详细信息,请参见动态创建 Web 服务器控件模板。
您也可以将值传递到类的构造函数,类可以使用该值来确定要创建的模板类型(ItemTemplate、EditItemTemplate,等等)。
通常,使用 DataGrid 控件中已定义的 ListItemType 枚举中的值来传递该模板类型。
在该类中,实现 InstantiateIn 方法(ITemplate 接口的唯一成员)。此方法提供将文本实例和控件实例插入指定容器的方法。
下面的示例显示动态模板列的模板类。构造函数接受两个参数:第一个参数指定要创建的模板类型,第二个参数用于传入所创建列的名称。由于它是 DataGrid 控件的模板,所以该类包括创建包含 Textbox 控件的 EditItem 模板的代码。
' Visual Basic
Private Class DataGridTemplate
Implements ITemplate
Dim templateType As ListItemType
Dim columnName As String
Sub New(ByVal type As ListItemType, ByVal ColName As String)
templateType = type
columnName = ColName
End Sub
Sub InstantiateIn(ByVal container As Control) _
Implements ITemplate.InstantiateIn
Dim lc As New Literal()
Select Case templateType
Case ListItemType.Header
lc.Text = "<B>" & columnName & "</B>"
container.Controls.Add(lc)
Case ListItemType.Item
lc.Text = "Item " & columnName
container.Controls.Add(lc)
Case ListItemType.EditItem
Dim tb As New TextBox()
tb.Text = ""
container.Controls.Add(tb)
Case ListItemType.Footer
lc.Text = "<I>Footer</I>"
container.Controls.Add(lc)
End Select
End Sub
End Class
// C#
public class DataGridTemplate : ITemplate
{
ListItemType templateType;
string columnName;
public DataGridTemplate(ListItemType type, string colname)
{
templateType = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Literal lc = new Literal();
switch(templateType)
{
case ListItemType.Header:
lc.Text = "<B>" + columnName + "</B>";
container.Controls.Add(lc);
break;
case ListItemType.Item:
lc.Text = "Item " + columnName;
container.Controls.Add(lc);
break;
case ListItemType.EditItem:
TextBox tb = new TextBox();
tb.Text = "";
container.Controls.Add(tb);
break;
case ListItemType.Footer:
lc.Text = "<I>" + columnName + "</I>";
container.Controls.Add(lc);
break;
}
}
}
在为动态模板列创建类后,可以使用它在运行时将列分配给 DataGrid 控件。
使用动态模板列
创建 TemplateColumn 类的实例。
创建动态模板的实例,如果合适的话,将一个项类型值传递给它。
将该实例分配给您在第 1 步中创建的 TemplateColumn 对象的模板属性之一,如 ItemTemplate、EditItemTemplate、HeaderTemplate,等等。
下面的示例显示如何使用动态模板列将两个列添加到 DataGrid 控件中。在此示例中,在将控件绑定到它的数据源之前,在页加载期间,将模板实例化。
' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim tc1 As New TemplateColumn()
tc1.HeaderTemplate = New _
DataGridTemplate(ListItemType.Header, "Column1")
tc1.ItemTemplate = New DataGridTemplate(ListItemType.Item, _
"Column1")
tc1.EditItemTemplate = New _
DataGridTemplate(ListItemType.EditItem, "Column1")
tc1.FooterTemplate = New _
DataGridTemplate(ListItemType.Footer, "Column1")
DataGrid1.Columns.Add(tc1)
Dim tc2 As New TemplateColumn()
tc2.HeaderTemplate = New _
DataGridTemplate(ListItemType.Header, "Column2")
tc2.ItemTemplate = New _
DataGridTemplate(ListItemType.Item, "Column2")
tc2.EditItemTemplate = New _
DataGridTemplate(ListItemType.EditItem, "Column2")
tc2.FooterTemplate = New _
DataGridTemplate(ListItemType.Footer, "Column2")
DataGrid1.Columns.Add(tc2)
SqlDataAdapter1.Fill(DsCategories1)
DataGrid1.DataBind()
End Sub
// C#
private void Page_Load(object sender, System.EventArgs e)
{
TemplateColumn tc1 = new TemplateColumn();
tc1.HeaderTemplate = new
DataGridTemplate(ListItemType.Header, "Column1");
tc1.ItemTemplate = new
DataGridTemplate(ListItemType.Item, "Column1");
tc1.EditItemTemplate = new
DataGridTemplate(ListItemType.EditItem, "Column1");
tc1.FooterTemplate = new
DataGridTemplate(ListItemType.Footer, "Column1");
DataGrid1.Columns.Add(tc1);
TemplateColumn tc2 = new TemplateColumn();
tc2.ItemTemplate = new
DataGridTemplate(ListItemType.Item, "Column2");
tc2.HeaderTemplate = new
DataGridTemplate(ListItemType.Header, "Column2");
tc2.EditItemTemplate = new
DataGridTemplate(ListItemType.EditItem, "Column2");
tc2.FooterTemplate = new
DataGridTemplate(ListItemType.Footer, "Column2");
DataGrid1.Columns.Add(tc2);
sqlDataAdapter1.Fill(dsCategories1);
DataGrid1.DataBind();
}
请参见
Web 服务器控件模板 | 动态创建 Web 服务器控件模板