Hallo Forum,
ich möchte in einem Usercontrol auf die Tastenkombination Strg+S (speichern) reagieren.
Ich habe ein UserControl welches Daten eines eigenes Objekts darstellt. Der Nutzer kann in diesem Control die Daten des Objekts bearbeiten und dann über einen Button speichern.
Eine variable Anzahl solcher Contols werden in ein FloatLayout-Panel geschoben.
Nun möchte ich realisieren, dass beim Drücken von Strg+S ebenfalls gespeichert wird.
Dafür habe ich folgendes für eine TextBox auf dem Usercontrol geschrieben:
private void txtName_KeyDown(object sender, KeyEventArgs e)
{
if(((Control.ModifierKeys & Keys.Control)==Keys.Control) && (e.KeyCode==Keys.S))
{
// speichern
}
}
Das funktioniert auch super. Nur wenn ich das Event fürs ganze Control definiere, kommt kein Event an.
Muss ich dieses Event für jedes Steuerelement auf dem Usercontrol definieren?
Das ist ja mehr als umständlich.
Gibt es noch ne andere Möglichkeit, wie ich Strg+S realisieren kann.
Bei google habe ich nichts Brauchbares gefunden, obwohl es doch nichts Ungewöhnliches ist.
Danke für eure Tipps
Hallo ayrtonsenna,
Muss ich dieses Event für jedes Steuerelement auf dem Usercontrol definieren?
KeyEvents gehen immer an das Control, das den Focus hat.
Das ist ja mehr als umständlich.
Hä? Das geht doch in einer Zeile (je nach zählweise sind es auch drei). Eine Zeile für alle Controls natürlich.
Gibt es noch ne andere Möglichkeit, wie ich Strg+S realisieren kann.
Wenn dein UserControl ein Form wäre, könntest du Form.KeyPreView benutzen.
herbivore
Aber den EventHandler muss ich ja für jedes Element definieren, oder?
Dass das dann nur ein paar Zeilen sind, ist mir schon klar... 🙂
Aber Danke für den Tip mit dem KeyPreview. Werde damit ein wenig rumprobieren.
MfG
Hi.
Das erste mal das ich ne Frage beantworten kann...hoffe ich jedenfalls ^^
Du kannst doch deinen Controls einfach immer das selbe Event zuweisen indem du das so machst.
Ich habs jetzt einfach mal für n paar Textboxen gemacht.
this.textBox1.KeyDown += new System.EventHandler(this.MeinKeyEvent);
this.textBox2.KeyDown += new System.EventHandler(this.MeinKeyEvent);
//...
//...
private void MeinKeyEvent(object sender, System.Windows.Forms.KeyEventArgs e)
{
//Ich mach dann mal was
}
Wenn du da natürlich mehr Elemente hast kannste das ja auch mit ner Schleife machen
Hoffe ich habe deine Frage richtig verstanden und beantworten.
mfg Kami
Hallo,
genau das ist die Frage gewesen: muss ich für jedes Control einen EventHandler haben?
Dass der Handler dann immer auf das selbe zeigt, ist mir schon klar. 🙂
Danke....
Hallo zusammen,
ich habe ja schon geschrieben, dass man nur eine zeile braucht, um eine EventHandler für alle Controls zu registrieren. Hier kommt sie (zu verwenden innerhalb des UserControls):
foreach (Control ctrl in Controls) { ctrl.KeyDown += new KeyEventHandler (MeinKeyEvent); }
herbivore
Hier mal meine verschachtelte Lösung:
public DataDialog()
{
InitializeComponent();
SetKeyEvent(this);
}
private void SetKeyEvent(Control control)
{
foreach (Control ctrl in control.Controls)
{
ctrl.KeyDown += new KeyEventHandler(ctrl_KeyDown);
SetKeyEvent(ctrl);
}
}
void ctrl_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 33:
{
awTabControl.SelectedIndex--;
break;
}
case 34:
{
awTabControl.SelectedIndex++;
break;
}
}
}
Für Controls in Controls in Controls in Controls in Controls...
Alf