2010-11-25 6 views
2

Hallo
Ich habe Website mit zwei Textfelder und dynamisch erstellen Validierungskontrolle. Dies ist Code aus ASPX-Datei:Problem mit ControlToValidate in dynamischen erstellen Validierung Kontrollen

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

Dies ist mein 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.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 ist nur auf leere Kontrolle validieren zu lassen.
Diese Validierung nicht funktioniert, wenn ich versuche:
1. Zum ersten Textbox zum Beispiel eingeben: 2009-09-09
2. Zum zweiten Textbox zum Beispiel ein: Jetzt 2009-10-09
, alles ist in Ordnung.
3. Ich ändere meine erste Textbox auf zum Beispiel 2009-12-09
Ich bekomme Fehler Eine schlechte Auswahl an Daten - es ist in Ordnung.
4. Ich korrigiere erste Textbox am 2009-09-09, Nachricht verschwindet-OK.
5. Erneut zum ersten Textfeld 2009-12-09 - Ich habe keinen Fehler, aber es sollte sein.
Was seltsam - im Debug-Modus kann ich sehen, dass in dem Code ein:

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

statt ValidationTB Steuerung wird RequiredFieldValidator1.ControlToValidate auf TextBox2 gesetzt (es nicht leer ist, so habe ich Fehler nicht-Meldung) .
Warum TextBox2 auf RequiredFieldValidator1.ControlToValidate statt ValidationTB Textfeld eingestellt ist und wie ich das lösen könnte?
Dank
Grüße

Antwort

2

Es sieht so aus, als ob Sie wirklich wollen, ist ein CompareValidator anstelle von dem, was Sie verwenden.

Rewrite Ihre dritte IF-Block, so dass es wie folgt aussieht:

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

Dieses Sie das gewünschte Ergebnis geben sollte.

Jetzt ... lassen Sie uns über andere Dinge reden, die hier ablaufen.

Erstens, es sei denn, Sie tun dies nur als Beweis des Konzepts, dann ermutige ich Sie, die validators in a standard way zu verwenden. Nichts, was Sie hier tun, erfordert, dass Sie diese Validatoren dynamisch hinzufügen. Alles, was Sie erreichen möchten, erreichen Sie, indem Sie einfach die Validatoren in das Markup einfügen.

Zweitens wird Ihr Event Handler für den Text geändert Ereignis wird wahrscheinlich nicht tun, was Sie wollen. Wie es jetzt steht, wird es in der page lifecycle zu spät feuern, um Fehler vor Ihrem Page_Load Ereignis zu fangen. Ihr aktueller Code wird eine Ausnahme auslösen, wenn ich "Blah" in beide Textfelder eingabe, weil versucht wird, diese in DateTime Typen umzuwandeln.

Schließlich, wenn IDs der vorhandenen Steuerelemente zugewiesen werden, sollten Sie die ID-Eigenschaft dieses Steuerelements anstelle der Magic Strings verwenden, die Sie jetzt verwenden.Auf diese Weise müssen Sie sich keine Gedanken darüber machen, die ID an mehreren Stellen zu ändern, wenn Sie sie im Markup ändern möchten.

Wie auch immer, ich hoffe, das hilft.

+0

Vielen Dank! Ihre Lösung funktioniert :) Aber ich verstehe immer noch eine Sache nicht. Warum TextBox2 auf RequiredFieldValidator1.ControlToValidate anstelle von ValidationTB Textfeld festgelegt? Jedes Steuerelement für ControlToValidate-Eigenschaft, die ich nach ID festgelegt habe, aber es gibt immer noch TextBox2. Danke – luk4443

+0

@ luk4443, um ehrlich zu sein bin ich mir selbst nicht wirklich sicher. Ich habe Ihren Code in eine Beispiellösung kopiert und das gleiche passiert. Es passiert nicht, bis Sie es der 'Panel.Controls'-Sammlung hinzufügen, also muss dort etwas passieren. Ohne jedoch in den Code zu schauen, um zu sehen, was passiert, werden wir vielleicht nie wissen. Es hängt wirklich davon ab, wie schlecht du es wissen willst :) – Josh

0

Schuss im Dunkeln, aber versuchen Sie Ihre Validator geben steuert IDs. RequiredFieldValidator1.ID = "HelloMyNameIsValidator1";

+0

Danke für die Antwort. Leider hilft es nicht und Fehlermeldung zeigt immer noch nicht :( – luk4443

Verwandte Themen