2010-11-25 3 views
2

Привет
У меня есть сайт с двумя текстовыми полями и динамически создаю контроль проверки. Это код из .aspx файла:Проблема с ControlToValidate в динамическом создании элементов управления проверкой

<form runat="server"> 
<asp:TextBox AutoPostBack="true" ID="TextBox1" Text="" runat="server" Width="200px" 
OnTextChanged="TextBox1_TextChanged"></asp:TextBox> 
    <asp:TextBox ID="TextBox2" runat="server" Visible="True" Width="200px"AutoPostBack="true"></asp:TextBox> 
<asp:Panel ID="Panel1" runat="server"> 
</asp:Panel> 
<asp:TextBox ID="ValidationTB" runat="server" Visible="true"></asp:TextBox> 
</form> 

Это мой код-за:

public partial class _Default : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (TextBox2.Visible) 
    { 
     if (!String.IsNullOrEmpty(TextBox1.Text) && String.IsNullOrEmpty(TextBox2.Text)) 
     { 
      RequiredFieldValidator RequiredFieldValidator1 = new RequiredFieldValidator(); 
      RequiredFieldValidator1.Enabled = true; 
      RequiredFieldValidator1.ErrorMessage = "Second field required"; 
      RequiredFieldValidator1.Display = ValidatorDisplay.Dynamic;     
      RequiredFieldValidator1.ControlToValidate = "TextBox2"; 
      Panel1.Controls.Add(RequiredFieldValidator1); 
      RequiredFieldValidator1.Validate(); 
     } 
     if (!String.IsNullOrEmpty(TextBox2.Text) && String.IsNullOrEmpty(TextBox1.Text)) 
     { 
      RequiredFieldValidator RequiredFieldValidator1 = new RequiredFieldValidator(); 
      RequiredFieldValidator1.Enabled = true; 
      RequiredFieldValidator1.ErrorMessage = "First field required"; 
      RequiredFieldValidator1.Display = ValidatorDisplay.Dynamic; 
      RequiredFieldValidator1.ControlToValidate = "TextBox1"; 
      Panel1.Controls.Add(RequiredFieldValidator1); 
      RequiredFieldValidator1.Validate(); 
     } 
     if (!String.IsNullOrEmpty(TextBox2.Text) && !String.IsNullOrEmpty(TextBox1.Text)) 
     { 
      if (Convert.ToDateTime(TextBox2.Text) < Convert.ToDateTime(TextBox1.Text)) 
      { 
       ValidationTB.Text = null; 
       RequiredFieldValidator RequiredFieldValidator1 = new RequiredFieldValidator(); 
       RequiredFieldValidator1.Enabled = true; 
       RequiredFieldValidator1.ErrorMessage = "Bad range of dates"; 
       RequiredFieldValidator1.Display = ValidatorDisplay.Dynamic;      
       RequiredFieldValidator1.ControlToValidate = "ValidationTB"; 
       Panel1.Controls.Add(RequiredFieldValidator1); 
       RequiredFieldValidator1.Validate(); 
      } 
     } 
    } 
} 

protected void TextBox1_TextChanged(object sender, EventArgs e) 
{ 
    RegularExpressionValidator RegularExpressionValidator1 = new RegularExpressionValidator(); 
    RegularExpressionValidator1.ValidationExpression = @"^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$"; 
    RegularExpressionValidator1.Enabled = true; 
    RegularExpressionValidator1.ErrorMessage = "Bad format of date"; 
    RegularExpressionValidator1.Display = ValidatorDisplay.Dynamic; 

    if (!String.IsNullOrEmpty(TextBox1.Text)) 
    { 
     RegularExpressionValidator1.ControlToValidate = "TextBox1"; 
     Panel1.Controls.Add(RegularExpressionValidator1); 
     RegularExpressionValidator1.Validate(); 
    } 
    if (!String.IsNullOrEmpty(TextBox2.Text)) 
    { 
     RegularExpressionValidator1.ControlToValidate = "TextBox2"; 
     Panel1.Controls.Add(RegularExpressionValidator1); 
     RegularExpressionValidator1.Validate(); 
    } 
} 

}

TextBox ValidationTB просто сделать проверку на пустой контроль.
Эта проверка не работает, когда я пытаюсь:
1. К первому текстовому полю введите, например: 2009-09-09
2. Ко второй текстового поля ввода, например: 2009-10-09
Теперь все это нормально.
3. Я меняю свое первое текстовое поле, например, на 2009-12-09
Я получаю ошибку. Плохой диапазон дат - все в порядке.
4. Я исправляю первый текстовый файл в 2009-09-09, сообщение исчезает-ОК.
5. Снова введите первый текстовый блок 2009-12-09 - У меня нет ошибки, но это должно быть.
Что странно - в режиме отладки, я могу видеть, что в коде:

  if (Convert.ToDateTime(TextBox2.Text) < Convert.ToDateTime(TextBox1.Text)) 
      { 
       ValidationTB.Text = null; 
       RequiredFieldValidator RequiredFieldValidator1 = new RequiredFieldValidator(); 
       RequiredFieldValidator1.Enabled = true; 
       RequiredFieldValidator1.ErrorMessage = "Bad range of dates"; 
       RequiredFieldValidator1.Display = ValidatorDisplay.Dynamic;      
       RequiredFieldValidator1.ControlToValidate = "ValidationTB"; 
       Panel1.Controls.Add(RequiredFieldValidator1); 
       //In debug window: RequiredFieldValidator1.ControlToValidate = "TextBox2" 
       RequiredFieldValidator1.Validate(); 
      } 

вместо контроля ValidationTB, RequiredFieldValidator1.ControlToValidate установлен в TextBox2 (оно не пусто, так что я не ошибка сообщение) ,
Почему TextBox2 установлен в RequiredFieldValidator1.ControlToValidate вместо текстового блока ValidationTB и как я могу это решить?
Благодаря
Привет

ответ

2

Похоже, что вы действительно хотите получить CompareValidator вместо того, что используете.

Перепишите свой 3-й ПЧ блок, так что это выглядит следующим образом:

if (!String.IsNullOrEmpty(TextBox2.Text) && !String.IsNullOrEmpty(TextBox1.Text)) 
{ 
    Response.Write("Executing Block 3"); 
    ValidationTB.Text = null; 
    CompareValidator CompareValidator1 = new CompareValidator(); 
    CompareValidator1.Enabled = true; 
    CompareValidator1.ErrorMessage = "Bad range of dates"; 
    CompareValidator1.Display = ValidatorDisplay.Dynamic; 
    CompareValidator1.Operator = ValidationCompareOperator.LessThan; 
    CompareValidator1.Type = ValidationDataType.Date; 
    CompareValidator1.ControlToCompare = TextBox2.ID; 
    CompareValidator1.ControlToValidate = TextBox1.ID; 
    Panel1.Controls.Add(CompareValidator1); 
    CompareValidator1.Validate(); 
} 

Это должно дать вам желаемый результат.

Теперь ... давайте поговорим о других вещах, происходящих здесь.

Во-первых, если вы просто не делаете это как доказательство концепции, я настоятельно рекомендую вам использовать validators in a standard way. Ничто из того, что вы здесь делаете, требует, чтобы вы добавляли эти валидаторы динамически. Все, чего вы хотите достичь, может быть достигнуто простым добавлением валидаторов в разметку.

Во-вторых, ваш обработчик событий для события с измененным текстом, вероятно, не будет делать то, что вы хотите. Поскольку он стоит прямо сейчас, он будет слишком поздно срабатывать в page lifecycle, чтобы поймать ошибки перед вашим событием Page_Load. Ваш текущий код генерирует исключение, если я введу «Blah» в оба текстовых поля, потому что он попытается преобразовать их в типы DateTime.

Наконец, при назначении идентификаторов существующих элементов управления вы должны использовать свойство ID этого элемента управления вместо Magic Strings, которое вы используете сейчас.Таким образом, вам не придется беспокоиться об изменении идентификатора в нескольких местах, если вы решите изменить его в разметке.

В любом случае, я надеюсь, что это поможет.

+0

Спасибо большое! Ваше решение работает :) Но я до сих пор ничего не понимаю. Почему для TextBox2 установлено значение RequiredFieldValidator1.ControlToValidate вместо текстового поля ValidationTB? Каждый элемент управления для свойства ControlToValidate I устанавливается по идентификатору, но все еще есть TextBox2. Спасибо – luk4443 2010-11-26 12:31:00

0

Выстрел в темноте, но попробуйте дать свой валидатор контролирует идентификаторы. RequiredFieldValidator1.ID = "HelloMyNameIsValidator1";

+0

Спасибо за ответ. К сожалению, это не помогает, и сообщение об ошибке все еще не отображается :( – luk4443 2010-11-26 00:29:31

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

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