2009-03-31 2 views
0

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

Вот мой Переключает() метод (помните редактируемые и текст общие свойства):

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 

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

Спасибо за вашу помощь заранее.

+0

Вы используете loadcontrol для загрузки usercontrol? – AndreasN

+0

Нет, элемент управления зарегистрирован на странице .aspx. – Jason

ответ

0

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

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

Когда вы установите видимое свойство элемента управления на False, оно не будет отображаться в Html, поэтому оно не может нести состояние между страницами. Вместо этого рассмотрите возможность использования управления MultiView

+0

Сам элемент управления никогда не устанавливается в visible = false, а только элементы управления внутри него. Свойство Text элемента управления ДОЛЖНО сохранять свою ценность через обратную передачу, не так ли? – Jason

+0

Нет текстового поля не будет поддерживать состояние через postbacks, так как вы устанавливаете его видимым на false. что вам нужно сделать под вашим контролем, создайте MultiView и создайте в нем два вида. в первом представлении вы поместите текстовое поле и во вторую метку. Затем вам нужно изменить ActiveViewIndex из MV, если Editabl – Ender

+0

Правильно, но я установил его свойство text после того, как я сделаю его видимым снова. Свойство текста USERCONTROL должно сохраняться. Я понимаю, что текстовое свойство Textbox INSIDE не должно сохраняться в UserControl, но UserControl должен. По-моему, по крайней мере :) Правильно? – Jason

0

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

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

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

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

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

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


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

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

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

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

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

+0

поэтому единственный способ делать это с помощью viewstate? Я хотел бы использовать этот элемент управления для просмотра/редактирования профиля ... не может ли это испортить мое приложение? Почему набор текста UserControl не работает через обратную связь? – Jason

+0

извините, я пропустил ваш текст после вашего образца кода. Я устанавливаю свойство Text на странице_Load, если Not isPostBack, как и любой другой элемент управления (текстовые поля и т. Д.). Являются ли пользовательские элементы управления особенными? – Jason

+0

@ Джейсон добавил обновление, объясняющее больше об этом. – eglasius