Добавление новых полей в форму при изменении одного значения C # .NET 3.5 - PullRequest
1 голос
/ 09 февраля 2010

Я пишу какую-то форму. У меня есть одно поле в этой форме, которое содержит число. Например, если это число равно 3, я хочу, чтобы эта форма включила 9 новых полей, чтобы я мог добавить значения для этих 3 новых участников.

            <li>
                <asp:Label ID="lblAantaldeelnemendeploegen" runat="server" Text="Label">Aantal deelnemende ploegen: </asp:Label>
                <asp:TextBox ID="tbAantaldeelnemendeploegen" AutoPostBack="true" runat="server"></asp:TextBox>
            </li>

Это метка / текстовое поле, которое я отправляю обратно, чтобы увидеть, сколько новых полей я должен включить для пользователя. Теперь у моего codebehind есть этот код для проверки обратной передачи:

 if (Page.IsPostBack)
    {
        Request.Form
    }

Как теперь я могу добавить, например, 3 поля в эту форму? Какой вид контроля я могу лучше всего использовать для этого? Или как мне динамически добавить эти новые поля? Я новичок в этом, поэтому я много спрашиваю.

1 Ответ

1 голос
/ 09 февраля 2010

э-э ... я надеюсь, что вы не новичок в 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
...