2009-05-13 7 views
0

Ich brauche ein Textfeld, das nur der Benutzer zulassen kann, Ganzzahlen einzugeben. Der Benutzer kann jedoch keine Null eingeben. d. h. er kann 10,100 usw. eingeben. Nicht 0 allein. Wie kann ich ein Ereignis in KeyDown machen?Keine Null in Textfeld zulassen

+0

Ich denke, dass Ihre Tagging der Frage verwirrend ist, weil Sie WinForms haben, aber eine WPF-Antwort benötigen. – benPearce

Antwort

8

Die Art, wie Sie dies tun, ist für einen Benutzer sehr ärgerlich. Sie raten, was ein Benutzer eingeben möchte, und handeln nach Ihrer Vermutung, aber Sie können so falsch liegen.

Es hat auch Löcher, zum Beispiel kann ein Benutzer "10" eingeben und dann die "1" löschen. Oder er könnte eine "0" einfügen - du erlaubst doch Paste, oder?

Also meine Lösung wäre: Lassen Sie ihn jede beliebige Ziffer eingeben, die er mag, wie er will, und validieren Sie die Eingabe nur nach er beendet, zum Beispiel, wenn der Eingang den Fokus verliert.

+0

Jetzt mache ich das. Aber ich werde eine Lösung dafür finden. Lass es uns versuchen. – Sauron

+0

Das ist genau der Grund, warum meine Lösung das Validierungsereignis verwendet und den Schlüssel * wie vorgeschlagen ignoriert. Validieren Sie nur, wenn der Benutzer die Eingabe beendet hat. – VVS

3

Verwenden Sie int.TryParse, um den Text in eine Zahl zu konvertieren und zu überprüfen, ob diese Zahl nicht 0 ist. Verwenden Sie das Ereignis Validating für die Überprüfung.

// this goes to you init routine 
textBox1.Validating += textBox1_Validating; 

// the validation method 
private void textBox1_Validating(object sender, CancelEventArgs e) 
{ 
    if (textBox1.Text.Length > 0) 
    { 
     int result; 
     if (int.TryParse(textBox1.Text, out result)) 
     { 
      // number is 0? 
      e.Cancel = result == 0; 
     } 
     else 
     { 
      // not a number at all 
      e.Cancel = true; 
     } 
    } 
} 

EDIT:

Okay, da Sie WPF verwenden Sie einen Blick darauf, wie validation the WPF way zu implementieren nehmen sollte. Hier ist eine Validierung Klasse, die die obigen Logik implementiert:

public class StringNotZeroRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if (textBox1.Text.Length == 0) 
      return new ValidationResult(true, null); 

     int result; 
     if (int.TryParse(textBox1.Text, out result)) 
     { 
      // number is 0? 
      if (result == 0) 
      { 
       return new ValidationResult(false, "0 is not allowed"); 
      } 
     } 
     else 
     { 
      // not a number at all 
      return new ValidationResult(false, "not a number"); 
     } 

     return new ValidationResult(true, null); 
    } 
} 
+0

Mein Fall ist in WPF. – Sauron

6

Warum nicht ein NumericUpDown und nehmen Sie folgende Einstellungen:

upDown.Minimum = 1; 
upDown.Maximum = Decimal.MaxValue; 
+0

Ich glaube nicht, dass WPF ein NumericUpDown-Steuerelement hat. –

+0

Ich habe bis heute nicht mit WPF gearbeitet und ich habe dieses Tag in seiner Frage nicht gesehen. In diesem Fall würde ich alle nicht-numerischen Eingaben in dem Schlüssel-Abwärts-Ereignis aussortieren und in OnValidating auf Null prüfen (wie bereits von Bart erwähnt) – Oliver

0
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (textBox1.Text == "" && e.KeyChar == '0') 
     { 
      e.Handled = true; 
      return; 
     } 
     if (e.KeyChar < '0' || e.KeyChar > '9') 
     { 
      e.Handled = true; 
      return; 
     } 

    } 

nicht schön, aber es funktioniert

+0

Dies würde erlauben, "10" einzugeben und dann die "1" zu löschen. – VVS

+0

lässt Sie nicht zurück Raum – vaquito

1

Dies ist eine weitere Variation zum Thema:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    char newChar = Convert.ToChar(e.KeyValue); 
    if (char.IsControl(newChar)) 
    { 
     return; 
    } 
    int value; 
    e.SuppressKeyPress = int.TryParse((sender as TextBox).Text + newChar.ToString(), out value) ? value == 0 : true; 
} 
+0

KeyValue & SuppressKeyPress bekommt Fehler in WPF – Sauron

+0

Ah, verpasste das Wpf-Tag, meine schlechte. –

Verwandte Themen