Click here to Skip to main content
Licence CPOL
First Posted 20 Mar 2007
Views 43,977
Downloads 433
Bookmarked 12 times

Solve Dynamic Control Problem With PostBack

By | 29 Mar 2007 | Article
Create Dynamic Controls And Keep It On Page After PostBack

Introduction

When I try to create dynamic controls in gridview like (label, textbox, checkbox, etc.) lose my controls when the page is posted back. When I tried to find a solution on the internet I didn't find any so I decided to solve it by myself.

Problem Definition

  1. First I add TemplateColumn To gridview
  2. Then I but in (ItemTemplate) PlaceHolder control:
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" 
    AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound" 
    OnDataBinding="GridView1_DataBinding" OnDataBound="GridView1_DataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("RoomID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" 
    OnPreRender="PlaceHolder1_PreRender"></asp:PlaceHolder>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

Then the code that will create the controls based in DataBase Filed (RoomID) in the event RowDataBound as follows:

protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e) { 
PlaceHolder plc = (PlaceHolder)e.Row.Cells[1].FindControl("PlaceHolder1"); 
Label lbl_RoomID = (Label)e.Row.Cells[0].FindControl("Label1"); 
Label lblinsert = new Label();
        CheckBox chk = new CheckBox();
        TextBox txt = new TextBox();
        chk.Text = "tttttttt";
        lblinsert.Text = "xxxxxxxxx";
        
        if (lbl != null)
        {
            switch(lbl.Text)
            {
                case "1":plc.Controls.Add(lblinsert);
                        arr.Add(lblinsert);break;
                case "2":plc.Controls.Add(chk);
                        arr.Add(chk);break;
                case "3": plc.Controls.Add(txt);
                        arr.Add(txt); break;
                default: lblinsert.Text = " Dummy ";
                        plc.Controls.Add(lblinsert);
                        arr.Add(lblinsert); break;
               
            }
        }
} 
}

The Solution

When I creat controls in event RowDataBound I add them to ArrayList then at event DataBound I but ArrayList In Session

protected void GridView1_DataBound(object sender, EventArgs e)
{
Session.Add("arrcon", arr);
}

Then at the PlaceHolder_PreRender event I got ArrayList and recreate controls into it again with its data

Int count = 0 ;
protected void PlaceHolder1_PreRender(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            arr = (ArrayList)Session["arrcon"];
            if (arr != null)
            {

                if (arr[count] is TextBox)
                {
                    TextBox txt = (TextBox)arr[count];
                    txt.Text = Request.Form[txt.UniqueID].ToString();
                    ((PlaceHolder)this.GridView1.Rows[count].Cells[1].FindControl(
                        "PlaceHolder1")).Controls.Add(txt);
                }
                else if (arr[count] is Label)
                {                
                    ((PlaceHolder)this.GridView1.Rows[count].Cells[1].FindControl(
                        "PlaceHolder1")).Controls.Add((Control)arr[count]);

                }
                else if (arr[count] is CheckBox)
                {
                    CheckBox chk = (CheckBox)arr[count];
                    if (Request.Form[chk.UniqueID] != null)
                    {
                        chk.Checked = true;
                    }
                    else
                    {
                        chk.Checked = false;
                    }
                    ((PlaceHolder)this.GridView1.Rows[count].Cells[1].FindControl(
                        "PlaceHolder1")).Controls.Add(chk);
                }
               count++;
            }
        }
    }

And this solved my problem

License

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

About the Author

magedo93

Web Developer

Egypt Egypt

Member

AHMED AHMED MOHAMED ABO EL-MAGD :
Team Leader For 3D game (1’s Person View) The Last Great Pharouh
 
Senior Instructor
Senior Developer .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
GeneralMy vote of 4 Pinmemberralphy10123:04 7 Dec '10  
GeneralDynamic controls creation disappear problem PinmemberAsp bhai8:33 1 Mar '10  
Generalgr8, but I have very much moplicate datagrid...I can't use your solution... Pinmemberpintuuuuuuuuu3:11 17 Jun '08  
Questionok... but why use a session? Pinmembermorphix23:50 20 Mar '07  
AnswerRe: ok... but why use a session? Pinmembermagedo934:30 21 Mar '07  
GeneralRe: ok... but why use a session? PinmemberNong Tien Bac18:23 20 Nov '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.120517.1 | Last Updated 29 Mar 2007
Article Copyright 2007 by magedo93
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid