Réponse acceptée !
Bonsoir,
Comme je le dis souvent, il ne faut jamais faire de controles dynamiques à moins que l'on sache exactement ce que l'on fait.
Voici un petit exemple de ce que tu voudrais faire, cet exemple est simple à écrire et à comprendre lorsque le comprend parfaitement le mécanisme de viewstate et de cycle de vie de controle
<div>
<asp:TextBox ID="tbCount" runat="server" />
<asp:button id="btnCreateTB" runat="server" onclick="btnCreateTB_Click" Text="Create" />
<hr />
<asp:Repeater ID="rptTB" runat="server">
<ItemTemplate>
<ul>
</ItemTemplate>
<ItemTemplate>
<li>Value <%#Container.DataItem %> : <asp:TextBox ID="tbValue" runat="server" /></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
<asp:Button runat="server" ID="btnSave" onclick="btnSave_Click" Text="Save" />
<div>
<asp:Literal runat="server" ID="litValue" />
</div>
</div>
et dans le code behind :
public partial class _Default : System.Web.UI.Page
{
protected void btnCreateTB_Click(object sender, EventArgs e)
{
int tbCountValue = 0;
if (int.TryParse(tbCount.Text, out tbCountValue))
{
// permet de créer une collection d'entier quiservira de datasource [0, ..., n]
IEnumerable<int> data = Enumerable.Range(0, tbCountValue);
rptTB.DataSource = data;
rptTB.DataBind();
}
else
{
// devrait également être vérifier via un validator
throw new Exception("Incorrect value");
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
List<String> values = new List<string>();
foreach (RepeaterItem item in rptTB.Items)
{
// ne pas oublier SelectedItem si besoin
if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
TextBox tbValue = item.FindControl("tbValue") as TextBox;
if (tbValue != null)
{
values.Add(tbValue.Text);
}
else
{
// log this
throw new Exception();
}
}
}
litValue.Text = String.Join(" | ", values.ToArray());
}
}
Cyril -
MVP ASP.net -
MCPD ASP.net & MCTS SQL - Consultant indépendant