我有一个DropDownList
表格列表.在它之下有GridView
.根据从下拉列表框中选择的表,我将GridView
动态填充.由于表可能具有不同的列名,因此我需要动态地为GridView创建模板字段.
以下是我的绑定方法.我有两个问题:
我无法将绑定部分包装起来,if (!IsPostBack)
因为GridView
根据选择来填充DropDownList
,因此每次更改选择时,列都将被复制.
而且我没有任何数据,我想我需要设置ItemTemplate
的tField
(TemplateField
),但我怎么做呢?
private void BindGridView() { DataSet ds = new DataSet(); try { ds = … if (ds.Tables.Count > 0) { foreach (DataColumn dc in ds.Tables[0].Columns) { TemplateField tField = new TemplateField(); tField.HeaderText = dc.ColumnName; GridView2.Columns.Add(tField); } GridView2.DataSource = ds.Tables[0]; GridView2.DataBind(); } else { … } } catch (Exception ex) { … } }
R.C.. 17
应该注意以下各种步骤:
STEP我::
创建一个继承的接口.覆盖该方法的的接口.class
ITemplate
InstantiateIn()
ITemplate
第二步:
为您定义一个构造函数class
,将ListItemType
对象作为其参数.
第三步::
如果Control
添加到容器中的ControlCollection
必须绑定到某个DataSource列,则注册该处理程序.事件发生时,从数据源检索文本并将其分配给您的控件.例如,将 事件定义为将绑定数据绑定到内部创建的控件.OnDataBinding
event
hyprLnk_DataBinding
ItemTemplate
public class TemplateGenerator : ITemplate // Class inheriting ITemplate { ListItemType type; string columnName; public TemplateGenerator(ListItemType t, string cN) { type = t; columnName= cN; } // Override InstantiateIn() method void ITemplate.InstantiateIn(System.Web.UI.Control container) { switch (type) { case ListItemType.Item: HyperLink hyprLnk = new HyperLink(); hyprLnk.Target = "_blank"; //Optional. hyprLnk.DataBinding+=new EventHandler(hyprLnk_DataBinding); container.Controls.Add(hyprLnk); break; } } // The DataBinding event of your controls void hyprLnk_DataBinding(object sender, EventArgs e) { HyperLink hyprlnk = (HyperLink)sender; GridViewRow container = (GridViewRow)hyprlnk.NamingContainer; object bindValue = DataBinder.Eval(container.DataItem,columnName); // Adding check in case Column allows null values if (bindValue != DBNull.Value) { hyprlnk.Text = bindValue.ToString(); hyprlnk.NavigateUrl = "http://www.google.com"; } } }
就这样.上面只是ItemTemplate
动态创建GridView
并向项模板添加控件的示例.
现在,下面是实际执行动态创建模板列的调用的函数.您可以在需要时调用此函数,例如从DropDownList
事件处理程序中调用.
protected void GenerateGridViewColumnsDynamically() { // Create the TemplateField TemplateField firstName = new TemplateField(); firstName.HeaderText = "First_Name"; firstName.ItemTemplate = new TemplateGenerator(ListItemType.Item, "FirstName"); // Showing boundField example just for more context BoundField lastName = new BoundField(); lastName.DataField = "LastName"; lastName.HeaderText = "Last_Name"; // Add the Columns now MyGridView.Columns.Add(firstName); MyGridView.Columns.Add(lastName); }
注意:: FirstName和LastName是Columns
其名称传递给constructor
您的自定义的class
:TemplateGenerator
.
应该注意以下各种步骤:
STEP我::
创建一个继承的接口.覆盖该方法的的接口.class
ITemplate
InstantiateIn()
ITemplate
第二步:
为您定义一个构造函数class
,将ListItemType
对象作为其参数.
第三步::
如果Control
添加到容器中的ControlCollection
必须绑定到某个DataSource列,则注册该处理程序.事件发生时,从数据源检索文本并将其分配给您的控件.例如,将 事件定义为将绑定数据绑定到内部创建的控件.OnDataBinding
event
hyprLnk_DataBinding
ItemTemplate
public class TemplateGenerator : ITemplate // Class inheriting ITemplate { ListItemType type; string columnName; public TemplateGenerator(ListItemType t, string cN) { type = t; columnName= cN; } // Override InstantiateIn() method void ITemplate.InstantiateIn(System.Web.UI.Control container) { switch (type) { case ListItemType.Item: HyperLink hyprLnk = new HyperLink(); hyprLnk.Target = "_blank"; //Optional. hyprLnk.DataBinding+=new EventHandler(hyprLnk_DataBinding); container.Controls.Add(hyprLnk); break; } } // The DataBinding event of your controls void hyprLnk_DataBinding(object sender, EventArgs e) { HyperLink hyprlnk = (HyperLink)sender; GridViewRow container = (GridViewRow)hyprlnk.NamingContainer; object bindValue = DataBinder.Eval(container.DataItem,columnName); // Adding check in case Column allows null values if (bindValue != DBNull.Value) { hyprlnk.Text = bindValue.ToString(); hyprlnk.NavigateUrl = "http://www.google.com"; } } }
就这样.上面只是ItemTemplate
动态创建GridView
并向项模板添加控件的示例.
现在,下面是实际执行动态创建模板列的调用的函数.您可以在需要时调用此函数,例如从DropDownList
事件处理程序中调用.
protected void GenerateGridViewColumnsDynamically() { // Create the TemplateField TemplateField firstName = new TemplateField(); firstName.HeaderText = "First_Name"; firstName.ItemTemplate = new TemplateGenerator(ListItemType.Item, "FirstName"); // Showing boundField example just for more context BoundField lastName = new BoundField(); lastName.DataField = "LastName"; lastName.HeaderText = "Last_Name"; // Add the Columns now MyGridView.Columns.Add(firstName); MyGridView.Columns.Add(lastName); }
注意:: FirstName和LastName是Columns
其名称传递给constructor
您的自定义的class
:TemplateGenerator
.