2010-08-21 11 views
9

System: Windows7 Pro, Visual Studio 2010, C#C# - Pushing Geben Sie in MessageBox löst Steuer KeyUp Ereignis

Ich habe eine Textbox: textBox1 ich seine Veranstaltung gesetzt:

textBox1.KeyUp += new KeyEventHandler(textBox1_KeyUp); 

private void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     button1.PerformClick(); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrEmpty(textBox1.Text)) 
    { 
     MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 
} 

Es funktioniert gut, Das Problem ist, wenn die eingegebenen Daten ungültig sind, und so die MessageBox angezeigt wird, wenn ich ENTER auf der MessageBox OK-Taste, triggert es auch die, die die MessageBox wieder angezeigt wird. So löst es die MessageBox OK-Schaltfläche, die es verursacht, zu verschwinden, und löst auch die textbox_keyUp, die dann verursacht, dass die Messagebox erneut angezeigt wird.

Danke für Ihre Hilfe.

Antwort

17

Ja, das Meldungsfenster reagiert auf das Herunterfahren des Schlüssels. So sollte deine TextBox. Verwenden Sie stattdessen das KeyDown-Ereignis, Problem gelöst. Löst auch den nervigen BEEP, den der Benutzer normalerweise hört.

private void textBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == Keys.Enter) { 
      button1.PerformClick(); 
      e.SuppressKeyPress = true; 
     } 
    } 
+0

Aber das ist mein Problem, nicht ich will es beide auslösen, ich will es nur die MessageBox Taste –

+0

@WoF auslösen: ich besser buchstabieren würde aus. Beitrag aktualisiert. –

+0

Es hat funktioniert, danke man –

0

Steuerelemente werden nur Ereignisse auslösen, wenn sie den Fokus haben. In diesem Fall führen Sie also einen Klick mit der Maus aus, wobei der Fokus immer noch auf Ihrem Textfeld liegt. Aus diesem Grund können Sie nicht in das Nachrichtenfeld eingeben. Die Lösung ist folgenden Code innerhalb button1_Click Methode hinzufügen:

var btn = sender as Button; 
btn.Focus(); 

Diesmal Fokus wird auf der Schaltfläche so eingestellt werden, wenn Sie kein Ereignis auf dem Nachrichtenfeld einen Hit für Textfeld ausgelöst wird

+0

Ich kann verwenden, geben Sie das Meldungsfeld ein. In der Tat, was ich will, ist die Eingabe nur in der MessageBox, nicht in beiden die MessageBox und meine Taste –

+0

Okay, aber was ich versuchte zu sagen ist, dass mit Fokus auf die Schaltfläche, die Sie verwenden können, auf Ihrer Message-Box eingeben und Es wird das Textfeld-Ereignis nicht immer wieder auslösen – tchrikch

1

ich es gelöst für Listview, kann es für Textbox arbeiten:

private void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     textBox1.enable = false; 
     button1.PerformClick(); 
     textBox1.enable = true; 
    } 
}