2010-11-25 93 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