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

 Yyao 发布于 2023-02-09 09:38

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

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

    我无法将绑定部分包装起来,if (!IsPostBack)因为GridView根据选择来填充DropDownList,因此每次更改选择时,列都将被复制.

    而且我没有任何数据,我想我需要设置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)
    {
        …    
    }
}

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";
        }
    }
}

就这样.上面只是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.

1 个回答
  • 应该注意以下各种步骤:

    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";
            }
        }
    }
    

    就这样.上面只是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.

    2023-02-09 09:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有