Click here to Skip to main content
15,891,567 members
Articles / Web Development / ASP.NET

Solve Dynamic Control Problem With PostBack

Rate me:
Please Sign up or sign in to vote.
1.87/5 (21 votes)
29 Mar 2007CPOL 84.6K   961   13   8
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.NET
<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:

C#
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

C#
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

C#
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)


Written By
Web Developer
Egypt Egypt
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#

Comments and Discussions

 
QuestionCan you help me your example Pin
Member 1285977220-Nov-16 0:48
Member 1285977220-Nov-16 0:48 
GeneralNice Article Pin
kumar_k50825-Apr-13 1:07
kumar_k50825-Apr-13 1:07 
GeneralMy vote of 4 Pin
ralphy1017-Dec-10 23:04
ralphy1017-Dec-10 23:04 
GeneralDynamic controls creation disappear problem Pin
Asp bhai1-Mar-10 8:33
Asp bhai1-Mar-10 8:33 
Generalgr8, but I have very much moplicate datagrid...I can't use your solution... Pin
pintuuuuuuuuu17-Jun-08 3:11
pintuuuuuuuuu17-Jun-08 3:11 
Questionok... but why use a session? Pin
morphix20-Mar-07 23:50
morphix20-Mar-07 23:50 
AnswerRe: ok... but why use a session? Pin
magedo9321-Mar-07 4:30
magedo9321-Mar-07 4:30 
GeneralRe: ok... but why use a session? Pin
Nong Tien Bac20-Nov-08 18:23
Nong Tien Bac20-Nov-08 18:23 

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

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