э-э ... я надеюсь, что вы не новичок в asp.net. потому что иначе это может закончиться ужасом!
причины:
если вы динамически создаете элементы управления, они должны присутствовать после первого postBack, каждый postBack до AttachPostData SecondTry
. Вы должны снова присвоить элементам управления те же идентификаторы после postBack - в противном случае viewState / postBackData не будет прикреплен и закончится исключением.
поэтому предположим, что вы все это знаете, вот основной сценарий:
<asp:PlaceHolder runat="server" ID="phDynamicControls" />
и codeBehind
function /* add name and correct signature here - eventHandler for saveButton click-event */
{
// TODO rebuild controls from other postBacks somewhere
var control = new TextBox
{
ID = "myUniqueID"
}
this.phDynamicControls.Controls.Add(control);
}
расширяя его, чтобы избежать ловушек, сделайте следующее для своей страницы!
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
// this will only be executed if postback
// recreate controls from former postback
}
protected override object SaveViewState()
{
// TODO persist control hirarchie in here!! to allow restoring on next LoadViewState()
return base.SaveViewState();
}
очень легкий подход:
почему бы не использовать ретранслятор
<asp:Repeater runat="sever" ID="repDynamicControls">
<ItemTemplate>
<asp:TextBox runat="server" ID="txtCustom"/>
</ItemTemplate>
</asp:Repeater>
ваш код
function /* add name and correct signature here - eventHandler for saveButton click-event */
{
// TODO find out number of items!
var items = 3;
this.repDynamicControls.DataSource = Enumerable.Range(0, items); // zero-offset here
this.repDynamicControls.DataBind();
}
но у вас все еще возникла следующая проблема: сохраняйте данные ретранслятора (связывание), даже если ни одно событие вашей generate new item
кнопки не сработало.
в конце вы получите связывание как минимум 2 раза:
- 1-й на LoadViewState
- 2-й (необязательно) для eventHandler