tbaseflug
asked on
Create Unlimited Dynamic Controls
OK - I have a simple form and which will allow the user to enter filter criteria in a text box - what I am trying to do, is to let the user click a button and add a new dropdownlist and text box - the ddl will have AND|OR|=, etc. and the textbox will let them put in the text qualifier, etc.
So every time the user clicks the add new button - a new ddl and txt is added, along with the option to remove "row" of controls...
I am using an updatepanel etc... Any hep pn how this is possible would save my week!!!!
So every time the user clicks the add new button - a new ddl and txt is added, along with the option to remove "row" of controls...
I am using an updatepanel etc... Any hep pn how this is possible would save my week!!!!
since your new controls are made at runtime dynamically, there is not really an easy way to do this. You have to continually pass your new controls each postback. You could set a session variable to a List<yourControl> and check for that List every time your page loads (!IsPostBack) and if it is present, repopulate those controls. But then you would have to do manual viewstate maintenance.
ASKER
So something like this wouldn't work?
protected void Button1_Click(object sender, EventArgs e)
{
TextBox t = new TextBox();
PlaceHolder p = new PlaceHolder();
Page.Controls.Add(p);
p.Controls.Add(t);
}
ASKER
Would this address the issue:
http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx
And assuming so, how would I build/add the controls
http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx
And assuming so, how would I build/add the controls
protected void Button1_Click(object sender, EventArgs e)
{
TextBox t = new TextBox();
PlaceHolder p = new PlaceHolder();
Page.Controls.Add(p);
p.Controls.Add(t);
}
wont work because each postback you call (asynch) will just make a new textbox. It will not 'know' that you already made one or more.
{
TextBox t = new TextBox();
PlaceHolder p = new PlaceHolder();
Page.Controls.Add(p);
p.Controls.Add(t);
}
wont work because each postback you call (asynch) will just make a new textbox. It will not 'know' that you already made one or more.
ASKER
looking at that link, looks a bit convoluted to me... give me a bit here
just wrote a quick example... I am actually going to blog about this one, I will post it on here when I am done. This is a much easier approach (I think).
<!--ASPX-->
<asp:ScriptManager ID="sm" runat="server" />
<asp:UpdatePanel ID="up" runat="server">
<ContentTemplate>
<asp:Button ID="btn" runat="server" Text="Add Control" onclick="btn_Click" />
<asp:Panel ID="pnl" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
// C#
List<LiteralControl> persistControls = new List<LiteralControl>();
protected void Page_Load(object sender, EventArgs e)
{
if (Session["persistControls"] != null) // if you already have some controls populated
{
persistControls = (List<LiteralControl>)Session["persistControls"]; // pull them out of the session
foreach (LiteralControl lc in persistControls)
pnl.Controls.Add(lc); // and push them back into the page
}
}
protected void btn_Click(object sender, EventArgs e)
{
LiteralControl lc = new LiteralControl("<div style=\"border:solid 2px navy;padding:3px;margin:3px\">NEW CONTROL</div>");
pnl.Controls.Add(lc);// add it to your page
persistControls.Add(lc);// add it to the list
Session["persistControls"] = persistControls; // put it in the session
}
ASKER
This is PERFECT! What about, under my original scenario - how hard would it be to had a button added next to each control that allowed the user to remove that specific control?
That requires a bit more thought, give me some time here.
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
Here is a full explanation. Thanks for the idea!
http://naspinski.net/post/Adding-Persistent--Controls-is-AspNet.aspx
Let me know if you have any more questions.
http://naspinski.net/post/Adding-Persistent--Controls-is-AspNet.aspx
Let me know if you have any more questions.
ASKER
This is great and certainly appreciate all of the hard work and effort here! I dont suppose that these is anyway, which the delete and reset button clicked, to avoid a post-back? Was hopinh to keep it all async but if not, this will certainly work.
I was messing with that, and if you replace both instances of:
Response.Write()
With:
ph.Controls.Clear();
Page_Load(null, null);
You will get somewhat desired results, but the delete buttons don't always work successively. I don't really have time to look into it right now :P
Response.Write()
With:
ph.Controls.Clear();
Page_Load(null, null);
You will get somewhat desired results, but the delete buttons don't always work successively. I don't really have time to look into it right now :P
ASKER
thanks - I was also trying up.Update() with similar issues - in that some deletes you have to hit twice.
Last question I have for you - if I wanted to add a series of additional controls (really just a few textboxes and 1 dropdown, etc.) - do I place the code for them in the literal control or replace the literal with new instances of each of the controls that I want tio add?
Last question I have for you - if I wanted to add a series of additional controls (really just a few textboxes and 1 dropdown, etc.) - do I place the code for them in the literal control or replace the literal with new instances of each of the controls that I want tio add?
You can just replace the literals. I just used those as they are simple and can be declared with one line :P
ASKER
if I wanted to add any type of formatting 9to the layout of the dynamic controls) - could I wrap them in a span/div (within a literal) and only show "add" the one literal/container control?
yup
What I would do is make the pnl.CssClass = "someclass"; so then you could just manipulate the CSS
What I would do is make the pnl.CssClass = "someclass"; so then you could just manipulate the CSS
ASKER
so, could I do something like this?
LiteralControl lc = new LiteralControl("<span style=\"border:solid 1px navy;margin:3px\"> <asp:TextBox ID= rand.Next(1000, 9999).ToString() runat=\"serve\"></asp:Text Box></span >");
LiteralControl lc = new LiteralControl("<span style=\"border:solid 1px navy;margin:3px\"> <asp:TextBox ID= rand.Next(1000, 9999).ToString() runat=\"serve\"></asp:Text
no, since textbox is an as.net control you would have to declare it and add it seperately
LiteralControl lc = new LiteralControl("<span style=\"border:solid 1px navy;margin:3px\">");
TextBox txt = new TextBox();
txt.ID = "someID";
//then add them both:
ph.Controls.Add(lc);
ph.Controls.Add(txt);