Как добавить постоянные динамические элементы управления на основе пользовательского ввода (не при начальной загрузке страницы) - PullRequest
0 голосов
/ 13 октября 2010

Я знаком с созданием и сохранением динамических элементов управления при первой загрузке страницы и последующих постбэках, но у меня возникли проблемы со следующим инициируемым пользователем сценарием ...

В моей демонстрации у меня есть заполнитель, две кнопки и литерал

<div>
    <asp:PlaceHolder ID="phResponses" runat="server" />
</div>
<div>
    <asp:Button ID="btnAdd" Text="Add" runat="server" OnClick="Add"/>
    <asp:Button ID="btnInspect" Text="Inspect" runat="server" OnClick="Inspect"/>
</div>
<div>
    <asp:Literal ID="litResult" runat="server"/>
</div>

Я хочу, чтобы пользователь мог нажимать кнопку добавления, чтобы предоставить ответ, поэтому у меня есть ...

protected void Page_Init(object sender, EventArgs e)
{
    BuildControls();
}

protected void Add(object sender, EventArgs e)
{
    BuildControls();
}

protected void BuildControls()
{
    phResponses.Controls.Add(new LiteralControl { ID = "response_" + _Count.ToString() });
    _Count++;
}

_Count - статическая переменная-член, позволяющая мне иметь уникальные идентификаторы для новых элементов управления.Я понимаю, что мне нужно перестроить динамические элементы управления на Page_Init, но проблема в том, что я получаю 2 новых элемента управления Literal на каждую обратную передачу.Кроме того, если какое-либо свойство Text помещается в новые элементы управления, оно теряется при перестроении элементов управления.

Итак, как избежать добавления нескольких элементов управления и как сохранить вновь добавленные свойства при перестройке этих элементов управления?

Я использую следующее для проверки ответов

protected void Inspect(object sender, EventArgs e)
{
    foreach (var control in phResponses.Controls)
    {
        if (control is LiteralControl)
        {
            litResults.Text += "<p>" + control.Text + " : " + control.ID + "</p>";
        }
    }
}

Который сам добавляет еще один нежелательный элемент управления из-за восстановления на Page_Init

1 Ответ

0 голосов
/ 13 октября 2010

Я бы не уверен, что я вполне понимаю, о чем вы спрашиваете, но, похоже, вы просто хотите убедиться, что BuildControls вызывается только один раз за жизненный цикл.Вы можете сделать это, внеся следующие изменения:

  1. Добавьте новый private bool _isControlsBuilt = false;.
  2. Измените Page_Init, чтобы проверить _isControlsBuilt перед вызовом BuildControls.
  3. Установите _isControlsBuilt на true в BuildControls.
  4. Убедитесь, что BuildControls происходит раньше в жизненном цикле страницы , чем Page_Init.

Что касается потери значений элементов управления при обратной передаче, то они никогда не попадут в состояние просмотра.Я не уверен, что это сработает, но мое первое предположение - добавить в конец BuildControls строку для вызова Page.RegisterRequiresControlState:

protected void BuildControls()
{
    LiteralControl newLiteral = new LiteralControl { ID = "response_" + _Count };
    this.RegisterRequiresControlState(newLiteral);
    phResponses.Controls.Add(newLiteral);

    _Count++;
    _isControlsBuilt = true;
}

Еслиэто не работает (что может означать, что это _view_state, а не _control_state имеет значение для вас здесь), вам, возможно, придется посмотреть на прокрутку вашего собственного viewstate.Я написал о том, как это сделать, в моем ответе на # 3854193 , который вам может пригодиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...