2013-05-27 3 views
2

Мне нужно создать пользовательский TextBox, который принимает текст или цифры. После PostBack я хочу проверить значение, и если это не цифры - белый пробел позади TextBox со словами «Not Digits!». Я сделал свойство Number, которое проверяет значение, и если все нормально - поместите его в viewstate, иначе напишите строку «Not Digits!». Вот код:Пользовательский веб-элемент управления ASP.NET TextBox

namespace NumericTextBoxLibraryV2 
{ 
[DefaultProperty("Number")] 
[ToolboxData("<{0}:NumericTextBox runat=server></{0}:NumericTextBox>")] 
public class NumericTextBox : TextBox 
{ 
    public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set 
     { 
      base.Text = value; 
      if(!Int32.TryParse(value, out number)) 
       notNumber = "Digits only!"; 
     } 
    } 

    [Bindable(true)] 
    [Category("Appearance")] 
    //[DefaultValue("")] 
    //[Localizable(true)] 
    public int Number 
    { 
     get 
     { 
      if(ViewState["Number"] == null) 
      { 
       ViewState["Number"] = 0; 
      } 
      number = (int)ViewState["Number"]; 
      return number; 
     } 

     set 
     { 
      Match match = Regex.Match(value.ToString(), @"^\d+$"); 
      if (match.Success) 
      { 
       ViewState["Number"] = value; 
       notNumber = string.Empty; 
      } 
      else 
      { 
       notNumber = "Digits only!"; 
      } 
     } 
    } 

    private int number; 
    private string notNumber; 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(@"<span>{0}&nbsp;</span><br />", notNumber); 
     base.Render(writer); 
    } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     output.Write(Number); 
    } 
} 
} 

Вопрос: Как вы можете видеть, что я могу получить значение в TextBox прописан только из текста собственности. Есть ли способ написать код, который установит значение не в текст, а в мой номер свойства? И как сделать показано не свойство Text, а Number?

ответ

4

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

Там вы можете впрыснуть и получить значение прямо из параметров запроса.

Однако, поскольку вы расширяете текстовое поле, у вас всегда будет свойство текста. Чистая версия подразумевала бы расширение Control и выполнение ввода самостоятельно. Вы бы отказались от имущества Text и сохранили только ваше имущество Number.

Код будет чище и намного легче читать. Но, конечно, это требует немного больше работы. Обратите внимание, что в случае, если вы распространяете Control напрямую, вам необходимо реализовать IPostBackDataHandler. Этот интерфейс в основном сообщает странице, что ваши данные управления отправляются обратно, и с ним нужно обращаться по-разному.

+0

Спасибо! Все работает! –

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