How to add TemplateField to a gridview in the code behind?

后端 未结 2 1057
北恋
北恋 2021-02-06 08:37

I have a DropDownList which has a list of tables. Under it there is GridView. Based on the table selected from the drop down list box, I will populate the GridView

2条回答
  •  遇见更好的自我
    2021-02-06 08:48

    There are various steps that should be taken care of:

    STEP I:: Create a class inheriting the ITemplate interface. Override the method InstantiateIn() of the ITemplate interface.

    STEP II:

    Define a constructor for your class that takes a ListItemType object as its parameter.

    STEP III::

    If the Control being added to the container's ControlCollection has to be bound to some DataSource Column, then register the handler for the OnDataBinding event. When the event occurs, retrieve the text from the data source and assign it to your control. For Example, hyprLnk_DataBinding event is defined for Binding Data to your controls created inside 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";
            }
        }
    }
    

    That's all. Above was just a sample to create ItemTemplate dynamically for GridView and add controls to the Item Template.

    Now, Below is the function that will actually carry out the calls to create Template Columns dynamically. You can call this function when required for e.g. from your DropDownList event Handler.

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

    NOTE:: FirstName and LastName are the Columns whose Names are passed to the constructor of your custom class: TemplateGenerator.

提交回复
热议问题