开发者

Problem with ControlToValidate in dynamic create validation controls

开发者 https://www.devze.com 2023-01-27 04:59 出处:网络
Hi I have site with two text boxes and dynamically create validation control. This is code from .aspx file:

Hi

I have site with two text boxes and dynamically create validation control. This is code from .aspx file:

<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>  

This is my code-behind:

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.Displa开发者_高级运维y = 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 is just to make validate on empty control.

This validation doesn't work, when I try:

1. To first textbox enter for example: 2009-09-09

2. To second textbox enter for example: 2009-10-09

Now, everything is OK.

3. I change my first textbox on for example 2009-12-09

I get error Bad range of dates - it's OK.

4. I correct first textbox on 2009-09-09, message disappear-OK.

5. Again enter to first textbox 2009-12-09 - I don't have error, but it should be.

What strange - in debug mode I can see, that in code:

            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();
            }  

instead of ValidationTB control, RequiredFieldValidator1.ControlToValidate is set to TextBox2 (it isn't empty, so I haven't error message).

Why TextBox2 is set to RequiredFieldValidator1.ControlToValidate instead of ValidationTB textbox and how I could solve this?

Thanks

Regards


It looks like what you are really wanting is a CompareValidator instead of what you are using.

Rewrite your 3rd IF block so that it looks like this:

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();
}

This should give you the desired result.

Now... lets talk about some other things going on here.

First, unless you are just doing this as a proof of concept, then I highly encourage you to use the validators in a standard way. Nothing you are doing here requires that you add these validators in dynamically. Everything you want to accomplish can be achieved by simply adding the validators in the markup.

Second, your Event Handler for the text changed event is probably not going to do what you want. As it stands right now, it will fire too late in the page lifecycle to catch errors before your Page_Load event. Your current code will throw an exception if I enter "Blah" into both of the text boxes because it will attempt to convert those to DateTime types.

Lastly, when assigning ID's of existing controls you should use the ID property of that control instead of the Magic Strings you are using now. In this way you won't have to worry about changing the ID in multiple places if you decide to change it in markup.

Anyway, I hope this helps.


Shot in the dark, but try giving your validator controls IDs. RequiredFieldValidator1.ID = "HelloMyNameIsValidator1";

0

精彩评论

暂无评论...
验证码 换一张
取 消