UserControl Textbox не будет поддерживать состояние - PullRequest
0 голосов
/ 31 марта 2009

У меня очень простой пользовательский контроль, в основном текстовое поле и метка, цель которых - переключаться между собой. Элемент управления привязан во время Page_Load event страницы. В событии UserControl Page_Load я вызываю функцию Toggle (), которая показывает или скрывает соответствующий элемент управления и устанавливает его текст на основе булевого свойства Editable и свойства Text строки соответственно.

Вот мой метод Toggle () (помните, что Editable и Text являются публичными свойствами):

Public Sub Toggle()
    If Editable Then
        txtText.Visible = True
        lblText.Visible = False
        txtText.Text = Text
        txtText.CssClass = TextboxCSSClass
    Else
        txtText.Visible = False
        lblText.Visible = True
        lblText.Text = Text
        lblText.CssClass = LabelCSSClass
    End If
End Sub

Моя проблема также проста: когда кнопка на странице вызывает метод Toggle () элемента управления, переключение работает нормально, но текст исчезает! Я пробовал это с обычным несвязанным текстовым полем рядом с ним, и текстовое поле прекрасно поддерживает свое текстовое значение. Я что-то упускаю?

Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 31 марта 2009

Обновление: Дополнительная информация о комментариях.

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

Выше приведено другое для метки, так как это не элемент управления вводом. Если состояние представления отключено, если вы не устанавливаете текст при каждом запросе, он покажет начальное значение (попробуйте). ViewState - это то, что автоматически позволяет хранить информацию в постбэках для элементов управления.

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

Также обратите внимание, что отключение состояния просмотра также повлияет на вашу конфигурацию Visible. Я часто отключаю режим просмотра, но у вас может быть сценарий, в котором вы действительно хотите сохранить управляющую информацию в постбэках. При выключении состояния просмотра необходимо всегда настраивать элементы управления, а не только когда! IsPostBack.

Обратите внимание, что если вы отслеживаете то, что должно быть видимым, и текст в вашем коде, то вы можете отключить состояние просмотра внутреннего элемента управления (при условии, что вы не назначаете им другое свойство).


Первоначальный ответ:

Вы назначаете текущее значение свойства Text метке / текстовому полю. Если вы не установили значение в текущем запросе, оно имеет значение по умолчанию, поэтому вы получаете пустой текст.

Вы можете сохранить значение в viewstate как (синтаксис c #):

public string Text
{
   get
   {
      return (string) ViewState["MyText"];
   }
   set
   {
      ViewState["MyText"] = value;
   }
}

Ps. это не единственный способ сделать это. Если переключатель не задал текст, но вы сделали это в установщике для обоих элементов управления, они сохранят значения (до тех пор, пока вы присваиваете свойство Text пользовательского элемента управления после отслеживания состояния представления, как на странице «Загрузка»). ).

0 голосов
/ 31 марта 2009

Я понял это! Я прошу прощения за глупость. Вот что я делал неправильно: мой Get / Set для свойства Text хранился у частного участника. Это означает, что когда обновления были сделаны для текста, он не знал, поскольку он не был связан с текстовым полем. Вместо этого я сделал следующее:

Public Property Text() As String
    Get
        Return txtText.Text
    End Get
    Set(ByVal value As String)
        txtText.Text = value
    End Set
End Property

и в моем событии Page_Load:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        lblText.Text = Text
        Toggle()
    End If
End Sub

и теперь работает нормально! Спасибо тем, кто поставил меня на правильный путь! :)

0 голосов
/ 31 марта 2009

Если для свойства visible элемента управления установлено значение False, оно не будет отображаться в формате HTML, поэтому не может переносить состояние между страницами. Вместо этого рассмотрите возможность использования MultiView control

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