Click here to Skip to main content
Licence CPOL
First Posted 8 Jan 2007
Views 130,914
Downloads 394
Bookmarked 39 times

Dynamically Adding Template Columns to a GridView

By | 8 Jan 2007 | Article
How to add template columns dynamically to a GridView.

Introduction

Many a times we wonder how to add a template column dynamically. This might be the case when the number of columns, column types etc., cannot be decided during design time. For example, if the data source of a GridView control will be retrieved from a Business Layer, when designing the GridView user interface, the developer can not determine the number of columns and other things related to column description. In such a case, the GridView will be configured to generate columns automatically at runtime. Adding template columns at runtime was not possible in earlier versions of .NET, i.e., 1.0. With the new version of .NET 2.0 onwards, there is a facility to add template columns at runtime dynamically.

For the above purpose, I have created a class DynamicTemplate inheriting the ITemplate interface.

public class DynamicTemplate : System.Web.UI.ITemplate

Now the very first step is to implement the constructor for the class:

public DynamicTemplate(System.Web.UI.WebControls.ListItemType type)
{
    templateType = type;
}

Here I have passed ListItemType as a parameter to the constructor, which will define the type of the current template. I.e., the template can be a Header, Item, AlternatingItem, or Footer.

Next, for defining the type of the control template column will be displaying, I have added the following method:

public void AddControl(WebControl wbControl, 
            String BindPropertyName, String BindExpression)
{
    htControls.Add(htControls.Count, wbControl);
    htBindPropertiesNames.Add(htBindPropertiesNames.Count, BindPropertyName);
    htBindExpression.Add(htBindExpression.Count, BindExpression);
}

Here we need to pass three parameters: wbcontrol is the reference to any web control which we want our template column to display, BindPropertyName is the property name of the control to be bound, e.g., the Text property for a TextBox or Label control, and BindExpression is the field name or any valid Bind expression to be evaluated and assigned to the BindProperty.

Now for providing template column functionality, we need to implement the 'InstantiateIn' method. This method will be called for every row of the GridView before binding occurs.

public void InstantiateIn(System.Web.UI.Control container)
{
    PlaceHolder ph = new PlaceHolder();
    for (int i = 0; i < htControls.Count; i++)
    {
        //clone control 
        Control cntrl = CloneControl((Control)htControls[i]);
        switch (templateType)
        {
            case ListItemType.Header:
                break;
            case ListItemType.Item:
                ph.Controls.Add(cntrl);
                break;
            case ListItemType.AlternatingItem:
                ph.Controls.Add(cntrl);
                ph.DataBinding += new EventHandler(Item_DataBinding);
                break;
            case ListItemType.Footer:
                break;
        }
    }
    ph.DataBinding += new EventHandler(Item_DataBinding);
    container.Controls.Add(ph);
}

Here, we first clone the web control so that a new copy can be created, and then we add this new copy to the desired placeholder.

Next, we want to implement this class for adding the template column dynamically:

TemplateField t = new TemplateField();
DynamicTemplate mt = new DynamicTemplate(ListItemType.Item);
TextBox t1 = new TextBox();
t1.ID = "txt";
t1.Visible = true;
t1.Text = "1";
mt.AddControl(t1, "Text", "Sno");

Here we are creating a template column which will display a TextBox. And the Text property of this TextBox will be bound with the Sno data field of the configured data source.

A complete implementation of the above class is attached with this article, which is quite self-explanatory and simple.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Vikramaditya S Shekhawat

Architect

India India

Member

Originally from Jaipur(Rajasthan).
Working in Norway for a Software company.Holding diploma from CDAC and MCSD.NET (C#).

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
General[My vote of 2] Link button header - Commnad event not fire........... PinmemberSanjay g. Patel2:02 31 May '11  
GeneralHaving Period (or dot) in column name Pinmemberfarhan14023:56 5 Apr '11  
GeneralBinding problem with radio button list Pinmemberimrajanc21:09 18 Jan '10  
GeneralPage_Init PinmemberMember 21297155:33 17 Nov '09  
GeneralDynamically adding Template columns to a GridView after closing PopUP window Pinmemberkshafer10:39 30 Oct '09  
GeneralTexbox appearance problem PinmemberMember 59153289:21 25 Jul '09  
GeneralThanks Pinmemberarsalan_qamar6:09 27 May '09  
GeneralMy vote of 1 [modified] PinmemberWilko Gesink16:09 20 Feb '09  
GeneralRe: My vote of 1 Pinmemberarsalan_qamar6:06 27 May '09  
GeneralRe: My vote of 1 PinmemberVikramaditya S Shekhawat23:27 27 Jul '09  
QuestionDynamically Adding multiple columns PinmemberMSwati20:08 27 Jan '09  
QuestionDynamically Adding columns to existing datasource PinmemberMSwati20:28 18 Jan '09  
AnswerRe: Dynamically Adding columns to existing datasource PinmemberVikramaditya S Shekhawat4:16 20 Jan '09  
GeneralRe: Dynamically Adding columns to existing datasource PinmemberMSwati19:00 20 Jan '09  
Generalgenerate colums of the gridview from the listbox and make a header template dynamically Pinmemberpratap2k42:41 17 Jan '09  
GeneralUnable to retrieve value from Text Box that was added dynamically containing Blank Text Pinmemberanshubansal20008:05 21 Nov '08  
Generalrowcommand event is not fire PinmemberTripathi Swati20:54 24 Sep '08  
GeneralRe: rowcommand event is not fire PinmemberSanjay g. Patel22:19 30 May '11  
GeneralHi Vikramaditya Pinmemberdhassen0:03 13 Aug '08  
GeneralDynamically Adding Template columns Pinmembersandla21:09 31 Jul '08  
Generalgrid view Pinmemberclaradaisy19:29 14 Jul '08  
Questionadding click events?? Pinmemberprochaska9:50 23 May '08  
NewsError assigning integer Column to textbox PinmemberMember 76573215:52 7 May '08  
QuestionHi! I have added textboxes in gridview dynamically PinmemberAbhijit Aitwade23:42 21 Feb '08  
AnswerRe: Hi! I have added textboxes in gridview dynamically PinmemberAshish197820:31 6 Sep '08  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120528.1 | Last Updated 8 Jan 2007
Article Copyright 2007 by Vikramaditya S Shekhawat
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid