如何在后面的代码中将TemplateField添加到gridview?

GLP*_*GLP 7 asp.net gridview

我有一个DropDownList表格列表.在它之下有GridView.根据从下拉列表框中选择的表,我将GridView动态填充.由于表可能具有不同的列名,因此我需要动态地为GridView创建模板字段.

以下是我的绑定方法.我有两个问题:

  1. 我无法将绑定部分包装起来,if (!IsPostBack)因为GridView根据选择来填充DropDownList,因此每次更改选择时,列都将被复制.
  2. 而且我没有任何数据,我想我需要设置ItemTemplatetField(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)
    {
        …    
    }
}
Run Code Online (Sandbox Code Playgroud)

R.C*_*R.C 17

应该注意以下各种步骤:

STEP我:: 创建一个继承接口.覆盖该方法的的接口.class ITemplate InstantiateIn()ITemplate

第二步:

为您定义一个构造函数class,将ListItemType对象作为其参数.

第三步::

如果Control添加到容器中的ControlCollection必须绑定到某个DataSource列,则注册该处理程序.事件发生时,从数据源检索文本并将其分配给您的控件.例如,将 事件定义为将绑定数据绑定到内部创建的控件.OnDataBinding eventhyprLnk_DataBindingItemTemplate

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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

就这样.上面只是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);
}
Run Code Online (Sandbox Code Playgroud)

注意:: FirstName和LastName是Columns其名称传递给constructor您的自定义的class:TemplateGenerator.