Потеря текстового значения <asp: Label> из ViewState для динамически добавленного элемента управления - PullRequest
3 голосов
/ 05 марта 2012

Я добавляю элементы управления на страницу программно в коде позади. Я добавляю asp: Label и устанавливаю его текстовое значение. Я добавляю asp: TextBox и устанавливаю его значение Text. Оба текстовых значения возвращаются в ответе и отображаются в браузере. Пока все хорошо.

Пользователь выполняет действие, которое вызывает обратную передачу. Я перезагружаю динамически добавленные asp: Label и asp: TextBox. Когда Ответ возвращается в браузер, отображается только текстовое значение asp: TextBox. Значение asp: Label Text не равно.

Если я проверяю HTML, я вижу элемент управления asp: Label (отображается как тег span HTML), но без значения.

Как я могу получить код для автоматической повторной загрузки текстового значения asp: Label при каждой обратной передаче? Почему поведение asp: Label и asp: TextBox отличается? Я не хочу вручную переустанавливать значение Text для каждой обратной передачи.

Вот код, похожий на то, что я делаю (placeHolderNameplates - это элемент управления asp: PlaceHolder на странице aspx):

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If Not Page.IsPostBack Then
        Dim lbl As Label = New Label()
        lbl.ID = "xxx1"
        lbl.Text = "yo"
        placeHolderNameplates.Controls.Add(lbl)

        Dim tb As TextBox = New TextBox
        tb.ID = "xxx2"
        tb.Text = "yoyo"
        placeHolderNameplates.Controls.Add(tb)

    Else
        Dim lbl As Label = New Label()
        lbl.ID = "xxx1"
        placeHolderNameplates.Controls.Add(lbl)

        Dim tb As TextBox = New TextBox
        tb.ID = "xxx2"
        placeHolderNameplates.Controls.Add(tb)

    End If

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

Что вам нужно сделать, это добавить элемент управления к заполнителю перед установкой значений, поэтому он должен быть Dim lbl As Label = New Label()<br> placeHolderNameplates.Controls.Add(lbl)<br> lbl.ID = "xxx1"<br> lbl.Text = "yo"

Подробнее см. В этих сообщениях: http://www.yakkowarner.com/2008/01/aspnet-dynamic-controls-and-viewstate.html http://codebetter.com/jefferypalermo/2004/11/25/key-to-ensuring-dynamic-asp-net-controls-save-viewstate-level-300/

Прежде чем они будут добавлены на страницу, они сами не инициализируются.Когда динамический элемент управления добавляется в другой элемент управления, новый элемент управления воспроизводится, чтобы добраться до стадии, на которой находится родительский элемент управления. Например, если в вашем Page_Load вы добавляете текстовое поле, он будет воспроизводиться в режиме догонялки и идтичерез фазы инициализации и загрузки.Это важно, потому что он начнет отслеживать свое состояние просмотра.Значения, добавленные до отслеживания состояния представления, не сделают его состоянием просмотра и будут потеряны в PostBack.

0 голосов
/ 05 марта 2012

Привет, проверьте этот сайт MSDN

Вы должны добавить свой элемент управления со следующим событием (поэтому viewstate поддерживает автоматически)

override protected void OnInit(EventArgs e)

пример добавления динамического элемента управления http://support.microsoft.com/kb/317794/en-us

0 голосов
/ 05 марта 2012

Кажется, что динамически созданные элементы управления не будут автоматически добавлены в ViewState.Элемент управления TextBox, тем не менее, сохраняет свое значение из-за своего характера отображения в элементе <input type="text" value="xyz" /> html.

Ознакомьтесь с этой статьей:

http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i

...