2010-02-23 2 views
6

In meinem Projekt gibt es ein Benutzersteuerelement, das eine NumericUpDown ctrl enthält, und dessen gültigen Wertebereich liegt 10-100,Wie halten Sie den ungültigen Wert für NumericUpDown, nachdem es den Fokus verliert?

so dass, wenn Benutzereingaben 200 in NumericUpDown ctrl, dann wird sein Wert auf 100 automatisch geändert, nachdem Der Fokus wurde auf andere Strg geändert, es sieht ein wenig neugierig auf Kunden aus, da sie nach der Eingabe von 200 in der NumericUpDown-Ctrl auf die OK-Schaltfläche klicken können. Sie benötigen ein Meldungsfeld, das angibt, dass der eingegebene Wert nicht im Bereich liegt.

Die Frage ist jedoch, dass sich der Wert für NumericUpDown automatisch ändert, nachdem der Fokus geändert wurde, wenn die Eingabe außerhalb des Bereichs liegt.

Also, wie das zu implementieren?

Sameh Serag, das ist der Code, den ich getestet habe. Ich habe einen Knopf auf dem Formular hinzugefügt, aber nichts getan. Das Ergebnis für mich ist, nachdem ich 200 eingegeben und auf die Schaltfläche geklickt habe, wird nur eine Messagebox mit dem Wert 100 angezeigt. Nachdem ich 200 eingegeben habe und die Tabulatortaste gedrückt habe, wird nur eine Messagebox mit dem Wert 200 angezeigt und der Textwert in NumericUpDown wird auf 100 geändert. Also neugierig :-) Trotzdem vielen Dank für deine Hilfe! Übrigens ist die .Net-Framework-Version 2.0 mit sp2 für mich.

+2

Ich glaube nicht, dass dies möglich ist, aber ein, weil es ein Problem, das ich auch in der Vergangenheit geschlagen habe. Am Ende wechselte ich wieder zu einfachen alten TextBoxen. –

+0

+1 zu Matt.NumericUpDown-Steuerelemente sind die ekelhaftesten Steuerelemente, die jemals entwickelt wurden. Ich habe nie einen Benutzer beobachtet, der tatsächlich auf diese winzigen Knöpfe klickt oder die Pfeiltasten benutzt. Sie tippen einfach. Und Gott hilft Ihnen, wenn Sie auf einem Tablet sind. – Josh

+0

@Carlos_Liu: Ich habe meine Antwort nach der Änderung der Frage aktualisiert. Übrigens: Es hat in allen oben beschriebenen Szenarien für mich funktioniert. Probieren Sie es aus und lassen Sie uns die Ergebnisse wissen ;-) –

Antwort

13

Der Trick besteht darin, das Textfeld in das numerische Steuerelement zu integrieren und das Validating-Ereignis zu verarbeiten.

Hier ist, wie man es getan:

erstellen eine Dummy-Form und eine numerische updown Kontrolle und einige andere Steuerelemente hinzufügen, und wenn der numerische unpdown Steuerelement den Fokus verliert, wird der Text des Formulars festgelegt werden der Wert, den der Benutzer eingegeben hat.

Hier ist es der Code von dem, was ich getan habe:

public partial class Form1 : Form 
    { 
     TextBox txt; 
     public Form1() 
     { 
      InitializeComponent(); 
      txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
      txt.Validating += new CancelEventHandler(txt_Validating); 
     } 
     void txt_Validating(object sender, CancelEventArgs e) 
     { 
      this.Text = txt.Text; 
     } 
    } 

EDIT:

@Carlos_Liu: Ok, ich sehe jetzt das Problem, können Sie dies mit dem erreichen kann TextChanged-Ereignis, speichern Sie einfach den Wert in einer Dummy-Variablen und verwenden Sie ihn erneut bei txt_Validating, aber seien Sie vorsichtig, aktualisieren Sie diese Variable nur, wenn das Textfeld auf fokussiert ist. Hier

ist der neue Beispielcode:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1];//notice the textbox is the 2nd control in the numericupdown control 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) //don't save the value unless the textbox is focused, this is the new trick 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     MessageBox.Show("Val: " + val); 
    } 
} 

EDIT # 2

@Carlos_Liu: Wenn Sie den eingegebenen Wert müssen gehalten werden, noch gibt es einen Trick zu tun Also: @ das Validierungsereignis des Textfelds, überprüfen Sie den Wert, wenn er nicht innerhalb des Bereichs ist, brechen Sie den Fokus ab! Hier

ist eine neue Version des Codes:

public partial class Form1 : Form 
{ 
    TextBox txt; 
    string val; 
    public Form1() 
    { 
     InitializeComponent(); 
     txt = (TextBox)numericUpDown1.Controls[1]; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
     txt.Validating += new CancelEventHandler(txt_Validating); 
    } 

    void txt_TextChanged(object sender, EventArgs e) 
    { 
     if (txt.Focused) 
      val = txt.Text; 
    } 
    void txt_Validating(object sender, CancelEventArgs e) 
    { 
     int enteredVal = 0; 
     int.TryParse(val, out enteredVal); 
     if (enteredVal > numericUpDown1.Maximum || enteredVal < numericUpDown1.Minimum) 
     { 
      txt.Text = val; 
      e.Cancel = true; 
     } 
    } 
} 
+0

Es scheint, dass die Dosis nicht funktioniert, da der Wert nach Eingabe des Validierungsereignisses der Textbox gemäß NumericUpDown's min/Max Wert –

+0

Nein, es funktioniert für mich. Stellen Sie sicher, dass Sie das ** Validieren ** und nicht das ** Validierte ** Ereignis behandeln. Probieren Sie es einfach alleine aus und betten Sie es in Ihr Projekt ein. –

+0

Haben Sie versucht, einen Wert einzugeben, der größer als der maximale Wert von numericUpDown1 ist? Nehmen wir an, dass Maximalwert von numericUpDown1 100 ist, wenn Sie Eingabe 200, dann wird txt_Validating nach numericUpDown1 ausgelöst werden den Fokus verlieren, und Sie können die txt Text wie folgt Popup ### Leere txt_Validating (object sender, CancelEventArgs e) { MessageBox.Show (txt.Text); } ### Sie werden sehen, der Wert wurde bereits auf 100 –

Verwandte Themen