Accessing controls created dynamically (c#)
In my code behind (c#) I dynamically created some RadioButtonLists with more RadioButtons in each of them. I put all controls to a specific Panel. What I need to know is how to access those controls later as they are not created in .aspx file (with drag and drop from toolbox)?
I tried this:
foreach (C开发者_JAVA百科ontrol child in panel.Controls)
{
Response.Write("test1");
if (child.GetType().ToString().Equals("System.Web.UI.WebControls.RadioButtonList"))
{
RadioButtonList r = (RadioButtonList)child;
Response.Write("test2");
}
}
"test1" and "test2" dont show up in my page. That means something is wrong with this logic. Any suggestions what could I do?
You must recreate your controls after each postback.
ASP.NET is stateless, that is, when you postback a page to the server, your dynamically created controls won't be part of the page anymore.
Last week I had to overcome this situation once more.
What did I do? I saved the data that I used to create the controls inside Session object. On PageLoad method I passed that same data to recreate the dynamic controls.
What I suggest is: Write a method to create the dynamic controls.
On PageLoad method check to see if it's a postback...
if(Page.IsPostBack)
{
// Recreate your controls here.
}
A really important thing: assign unique IDs to your dynamically created controls so that ASP.NET can recreate the controls binding their existing event handlers, restoring their ViewState, etc.
myControl.ID = "myId";
I had a hard time to learn how this thing works. Once you learn you have power in your hands. Dynamically created controls open up a new world of possibilities.
As Frank mentioned: you can use the "is" keyword this way to facilitate your life...
if(child is RadioButtonList)
Note:
it's worth to mention the ASP.NET Page Life Cycle Overview page on MSDN for further reference.
When are you doing this in your code? Be sure you do this at the right time in the ASP life cycle or your controls don't exist yet: http://msdn.microsoft.com/en-us/library/ms178472.aspx
I don't think creating controls in the PageLoad is the right away of doing, first the asp.net life cycle goes from Initialization;Load ViewState Data;Load PostData; Object Load etc.
if you create controls at the Page_Load you'll lose the ViewState, events etc.
The right away is doing at PageInit, or if is a control (OnInit).
The next difficult is that at PageInit, you don't have the ViewState Available, if you need to reconstruct the number of objects you need to store some context/info in a hidden field ant then retrieve that information at PageInit, Create the objects and voila!
Example:
imagine that you need to create 1..N TextBoxes, you create html hidden field (not with runat=server) e.g. NumberOfTextBoxes.
When you are executing PageInit Code: you retrieve the value e.g. numberOfTextBoxes = Request.Form["NumberOfTextBoxes"], then you create the TextBoxes.
Remember the most important thing is to match the number and the order of existent Controls stored the ViewState.
精彩评论