2009-07-06 15 views
1

Ich habe eine TextBox und möchte ein KeyPress-Event von einem anderen Formular weiterleiten.Ein KeyPress-Event weiterleiten

Bisher habe ich meine Form:

private readonly Action<KeyPressEventArgs> m_KeyPress; 

public KeyboardForm(Action<KeyPressEventArgs> keyPress) 
{ 
    m_KeyPress = keyPress; 
} 

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    m_KeyPress(e); 
    base.OnKeyPress(e); 
} 

Und ein TextBox abgeleitet, die das Formular initialisiert:

var keyboardForm = new KeyboardForm(OnKeyPress); 
keyboardForm.Show(); 

Nun wird die OnKeyPress-Methode (von der Form, wie erwartet, genannt, dann von der TextBox). Aber trotzdem passiert nichts ... wenn ich 'a' drücke, erwartete ich ein 'a' in meiner TextBox ...

Hat jemand eine Idee, was ist das Problem hier?

Es funktioniert nicht mit KeyDown, auch, und die Befestigung an der regulären exposed Ereignis KeyPress hilft mir auch nicht. Ich denke, dass das Problem der ausdrückliche Aufruf von OnKeyPress ist. Ist es erlaubt?

+0

Warum der Downvote? Es ist eine gute Frage. –

Antwort

2

Form1:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Form2 f = new Form2(); 
     f.mEvent += new Form2.TestEvent(f_mEvent); 
     f.Show(); 
    } 

    void f_mEvent(KeyPressEventArgs e) 
    { 
     textBox1.Text += e.KeyChar; 
    } 
} 

Form2:

public partial class Form2 : Form 
{ 
    public delegate void TestEvent(KeyPressEventArgs e); 
    public event TestEvent mEvent; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (mEvent != null) 
     { 
      mEvent(e); 
     } 
     base.OnKeyPress(e); 
    } 
} 
+0

Vielen Dank für Ihren Vorschlag. Es funktioniert zumindest für normale Zeichen - ich habe eine Überprüfung hinzugefügt, wenn (char.IsLetterOrDigit (e.KeyChar)); Ich bin mir aber immer noch nicht sicher, warum die OnKeyPress() - Methode nicht aufgerufen werden kann. Es hätte den Vorteil, dass auch Sonderzeichen wie Backspace weitergeleitet werden. – tanascius

+0

Das Problem besteht darin, dass das Formular Keypress-Ereignisse nicht automatisch an die Textbox selbst weiterleitet. Sie könnten das obige f_mEvent ändern: textBox1.Focus(); SendKeys.Send (e.KeyChar.ToString()); Dies hat den Nachteil, dass das Formular jetzt den Fokus stiehlt, aber Backspaces funktionieren – SwDevMan81

+0

Sie gehen davon aus, dass ich zwei Formulare verwende - aber ich benutze nur ein Formular und eine abgeleitete TextBox, die das Formular initialisiert. Die abgeleitete TextBox hat Zugriff auf ihre OnKeyPress() - Methode. Das Problem ist nur, dass nichts passiert, wenn ich diese Funktion aufruft. – tanascius

1

Dies sollte das tun, was Sie wollen. Erstellen Sie den Text der Tasten auf dem Tastaturformular basierend auf der . Wenn Sie beispielsweise Kleinbuchstaben a möchten, geben Sie einfach "a" für den Text der Tastaturschaltfläche ein. Wenn Sie eine Rücktaste verwenden möchten, geben Sie einfach "Backspace" als Text der Schaltfläche ein. Alle Tastaturtasten Klicken Sie Ereignisse für die Buttonfunktion registrieren

Keyboard Form:

public partial class KeyboardForm : Form 
{ 
    public delegate void ButtonPressed(string keyPressed); 
    public event ButtonPressed ButtonPressedEvent; 

    public KeyboardForm() 
    { 
     InitializeComponent(); 
    } 

    private void ButtonClick(object sender, EventArgs e) 
    { 
     Button button = sender as Button; 
     if (button != null) 
     { 
      if ((ButtonPressedEvent != null)) 
      { 
       ButtonPressedEvent("{"+button.Text+"}"); 
      } 
     } 
    } 
} 

Formular mit Textbox, die der Benutzer Dinge in:

public partial class Form1 : Form 
{ 
    private KeyboardForm mKeyboardForm = new KeyboardForm(); 
    private bool mIsKeyboardCode = false; 

    public Form1() 
    { 
     InitializeComponent(); 
     mKeyboardForm.ButtonPressedEvent += new KeyboardForm.ButtonPressed(KeyboardFormButtonPressedEvent); 
    } 

    void KeyboardFormButtonPressedEvent(string keyPressed) 
    { 
     mIsKeyboardCode = true; 
     textBox1.Focus(); 
     SendKeys.SendWait(keyPressed.ToString()); 
     mKeyboardForm.Focus(); 
     mIsKeyboardCode = false; 
    } 

    private void TextBoxKeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.ControlKey) 
     { 
      if (!mKeyboardForm.Visible) 
      { 
       mKeyboardForm.Show(this); 
       e.Handled = true; 
      } 
     } 
     else if (!mIsKeyboardCode) 
     { 
      mKeyboardForm.Hide(); 
     } 
    } 
} 

Anmerkung: Ich nicht habe nutzen erweiterte Textbox mit einem Formular darin. Ich denke nicht, dass es ein guter Entwurf ist, ein Formular zu haben, das von einer kundenspezifischen Textbox gezeigt/versteckt wird.

+0

Danke für diesen zweiten Vorschlag, obwohl ich den ersten Ansatz bevorzuge. Übrigens. Für DataGridViews müssen Sie das Formular innerhalb der DataGridViewTextBox aufrufen. – tanascius

Verwandte Themen