2010-12-14 2 views
1

Первый - LblTextBox: метка и текстовое поле, которые имеют поле LabelText, который может быть установлен, чтобы изменить текст меткиПользовательские управления не инициализируются должным образом

Второй - LoginCtl: Контрольную Логин, который имеет два экземпляра из LblTextBox для имени пользователя, пароля и кнопки отправки

Я хочу управлять обработкой тегов этих элементов управления для форматирования, поэтому я не переопределяю CreateChildControls(), чтобы выполнить эту работу.

Моя проблема в том, что элементы управления визуализируются, но ни один из элементов OnInit() в обоих элементах управления не удерживается (пустые метки, стили CSS не применяются и т. Д.).

Любое направление было бы замечательным!

public class LblTextBox : CompositeControl 
{ 
    public string LabelText { get; set; } 
    public string Text { get; set; } 

    TextBox input; 
    Label label; 
    RequiredFieldValidator evalReqField; 

    public LblTextBox() 
    { 
     label = new Label(); 
     input = new TextBox(); 
     evalReqField = new RequiredFieldValidator(); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     label.ID = "lblTextBox"; 
     label.Text = string.Format("{0}:", LabelText); 

     input.ID = "tbInput"; 

     evalReqField.ID = "evalInput"; 
     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 
    } 

    protected override void RenderChildren(HtmlTextWriter writer) 
    { 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); 
     label.RenderControl(writer); 
     input.RenderControl(writer); 
     evalReqField.RenderControl(writer); 
     writer.RenderEndTag(); 
    } 
} 

public class LoginCtl : CompositeControl 
{ 
    public string UserName 
    { 
     get 
     { 
      return (ltbUser != null) ? ltbUser.Text : string.Empty; 
     } 
     set 
     { 
      if (ltbUser != null) 
       ltbUser.Text = value; 
     } 
    } 

    public string Password 
    { 
     get 
     { 
      return (ltbPass != null) ? ltbPass.Text : string.Empty; 
     } 
     set 
     { 
      if (ltbPass != null) 
       ltbPass.Text = value; 
     } 
    } 

    private LblTextBox ltbUser; 
    private LblTextBox ltbPass; 
    private Button btnSubmit; 

    public LoginCtl() 
    { 
     ltbUser = new LblTextBox(); 
     ltbPass = new LblTextBox(); 
     btnSubmit = new Button(); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     ltbUser.LabelText = "User Name"; 
     ltbPass.LabelText = "Password"; 
     btnSubmit.Text = "Submit"; 
     btnSubmit.CssClass = "Submit"; 
    } 

    protected override void RenderChildren(HtmlTextWriter writer) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "LoginCtlDiv"); 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); 
     ltbUser.RenderControl(writer); 
     ltbPass.RenderControl(writer); 
     btnSubmit.RenderControl(writer); 
     writer.RenderEndTag(); 
    } 
} 

ответ

1

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

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

Чтобы загрузить объекты, дождитесь события OnPreRender(). Все элементы управления будут загружены, а также данные. Затем я делаю окончательные изменения до того, как элемент управления будет отображаться на странице.

Еще одна небольшая заметка: мне действительно хотелось поменять тег по умолчанию, который обернут вокруг моих элементов управления для отображения (ASP будет обертывать его по диапазону по умолчанию). Поэтому, если вам нужен элемент уровня блока, это вызовет проблему. Если вы переопределите свойство TagKey и установите его в enum elem, он будет использовать это вместо тега span по умолчанию.

Я перестроенный его в следующем виде:

public class LblTextBox : CompositeControl 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     label.Text = string.Format("{0}:", LabelText); 
     base.OnPreRender(e); 
    } 

    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 

    protected override void CreateChildControls() 
    { 
     label = new Label(); 
     input = new TextBox(); 
     evalReqField = new RequiredFieldValidator(); 

     label.ID = "lblTextBox"; 
     input.ID = "tbInput"; 
     evalReqField.ID = "evalInput"; 

     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 

     Controls.Add(label); 
     Controls.Add(input); 
     Controls.Add(evalReqField); 
     base.CreateChildControls(); 
    } 

    public string LabelText { get; set; } //label text 
    public string Text { get; set; } //text in textbox 

    TextBox input; 
    Label label; 
    RequiredFieldValidator evalReqField; 
} 


public class LoginCtl : CompositeControl 
{ 
    protected override void CreateChildControls() 
    { 
     ltbUser = new LblTextBox(); 
     ltbPass = new LblTextBox(); 
     btnSubmit = new Button(); 

     ltbUser.LabelText = "User Name"; 
     ltbPass.LabelText = "Password"; 
     ltbPass.MargBetween = "10px"; 
     btnSubmit.Text = "Submit"; 
     btnSubmit.CssClass = "Submit"; 

     Controls.Add(ltbUser); 
     Controls.Add(ltbPass); 
     Controls.Add(btnSubmit); 
    } 

    //.. 
    //.. 

    private LblTextBox ltbUser; 
    private LblTextBox ltbPass; 
    private Button btnSubmit; 

    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 
} 
0

Я не помню, почему (я постараюсь вспомнить), но у меня была очень похожая проблема несколько месяцев назад, и мое решение было инициализировать все свойства кроме «ID» в обработчик события OnLoad :

protected override void OnLoad(EventArgs e) 
{ 
     label.Text = string.Format("{0}:", LabelText); 
     evalReqField.ControlToValidate = input.ID; 
     evalReqField.ErrorMessage = "(Required)"; 
     evalReqField.Display = ValidatorDisplay.Dynamic; 

} 

Надеется, что это помогает

+0

Это может очень хорошо работать. Я уже разработал решение. Кажется, что обычно есть несколько способов решения таких вопросов: D Я в основном переформатировал этот вопрос, потому что он был плохо отформатирован и сформулирован для любого, что может столкнуться с этим в процессе обучения. –

Смежные вопросы