I have textbox \"tb1\" on my page and I want users to be able to add another if they need to input more data. I have the following code:
VB:
You could build your own TextBoxCollection CompositeControl which would enable you to achieve the functionality you require.
I have put together a basic example of how it could be achieved.
Control
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ASPNetWebApplication.Controls
{
public class TextBoxCollection : CompositeControl
{
private List TextBoxes
{
get
{
if (ViewState["TextBoxes"] == null)
{
ViewState["TextBoxes"] = new List();
}
return (List)ViewState["TextBoxes"];
}
set
{
ViewState["TextBoxes"] = value;
}
}
protected override void CreateChildControls()
{
foreach (string textBox in TextBoxes)
{
Controls.Add(new TextBox() { ID = textBox });
Controls.Add(new Literal() { Text = "
" });
}
}
public TextBox GetTextBox(string id)
{
return (TextBox)Controls.Cast().Where(t => (t.ID == null ? "" : t.ID.ToLower()) == id.ToLower()).SingleOrDefault();
}
public void AddTextBox(string id)
{
TextBoxes.Add(id);
}
}
}
Example Markup
Note: Change Assembly="ASPNetWebApplication"
to the name of your assembly.
<%@ Register Assembly="ASPNetWebApplication" Namespace="ASPNetWebApplication.Controls" TagPrefix="ASPNetWebApplication" %>
...
Example Codebehind
protected void AddTextBoxesButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
TextBoxCollection1.AddTextBox(string.Format("TextBox{0}", i));
}
AddTextBoxesButton.Visible = false;
GetTextBoxValuesButton.Visible = true;
}
protected void GetTextBoxValuesButton_Click(object sender, EventArgs e)
{
TextBoxEntriesLabel.Text = string.Empty;
for (int i = 0; i < 10; i++)
{
string textBoxId = string.Format("TextBox{0}", i);
TextBoxEntriesLabel.Text += string.Format("TextBox: {0}, Value: {1}
", textBoxId, TextBoxCollection1.GetTextBox(textBoxId).Text);
}
}
Hope this helps.