2010-11-25 62 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(); 
    } 
} 

}

文本框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文本框,我该如何解决这个问题?
谢谢
Regards

回答

2

它看起来像你真正想要的是CompareValidator而不是你正在使用。

重写你的第三个IF块,使得它看起来像这样:

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时,应该使用该控件的ID属性,而不是现在使用的魔术字符串。这样,如果您决定在标记中更改标识,则不必担心在多个位置更改标识。

无论如何,我希望这有助于。

+0

非常感谢您的解决方案:)但我仍然不明白一件事。为什么TextBox2被设置为RequiredFieldValidator1.ControlToValidate而不是ValidationTB文本框?每个控件都是通过ID设置的ControlToValidate属性,但仍然存在TextBox2。谢谢 – luk4443 2010-11-26 12:31:00

0

在黑暗中拍摄,但尝试给你的验证控件ID。 RequiredFieldValidator1.ID = "HelloMyNameIsValidator1";

+0

感谢您的回复。不幸的是,它并没有帮助,错误信息仍然不显示:( – luk4443 2010-11-26 00:29:31