2009-07-06 8 views
1

J'ai une zone de texte et j'aimerais transférer un événement KeyPress à partir d'un autre formulaire.Transférer un événement KeyPress

Jusqu'à présent, j'ai mon formulaire:

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); 
} 

Et une zone de texte dérivé, qui initialise le formulaire:

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

Maintenant, la OnKeyPress méthode est appelée comme prévu (du formulaire, puis de la TextBox). Mais quand même rien ne se passe ... quand j'appuie sur 'a' je m'attendais à ce qu'un 'a' apparaisse dans mon TextBox ...

Est-ce que quelqu'un a une idée du problème ici?

Il ne fonctionne pas avec KeyDown, aussi, et s'attachant à l'événement exposé régulier KeyPress ne m'aide pas non plus. Je pense, que le problème est l'appel explicite de OnKeyPress. Est-ce autorisé?

+0

Pourquoi la downvote? C'est une bonne question. –

Répondre

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

Merci pour votre suggestion. Cela fonctionne au moins pour les charactes normales - j'ai ajouté une vérification, si (char.IsLetterOrDigit (e.KeyChar)); Mais je ne suis toujours pas sûr de savoir pourquoi la méthode OnKeyPress() ne peut pas être appelée. Cela aurait l'avantage que même les caractères spéciaux comme Backspace sont transmis. – tanascius

+0

Le problème est que le formulaire ne transfère pas automatiquement les événements keypress dans la zone de texte elle-même. Vous pouvez remplacer f_mEvent par: textBox1.Focus(); SendKeys.Send (e.KeyChar.ToString()); Cela a l'inconvénient de la forme qui vole maintenant le focus, mais les backspaces fonctionneront – SwDevMan81

+0

Vous supposez que j'utilise deux formulaires - mais j'utilise seulement un formulaire et un TextBox dérivé qui initialise le formulaire. La TextBox dérivée a accès à sa méthode OnKeyPress(). Le problème est que rien ne se passe quand j'appelle cette fonction. – tanascius

1

Cela devrait faire ce que vous voulez. Faites le texte des boutons sur le formulaire de clavier basé sur le SendKey characters. Par exemple, si vous voulez un minuscule a, mettez simplement "a" pour le texte du bouton du clavier. Si vous voulez un bouton de retour arrière, il suffit de mettre "backspace" comme le texte du bouton. Tous les boutons du clavier Cliquez sur les événements peuvent s'inscrire à la fonction ButtonClick

forme du clavier:

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+"}"); 
      } 
     } 
    } 
} 

forme avec zone de texte que les types d'utilisateurs des choses dans:

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(); 
     } 
    } 
} 

Note: Je ne pas utiliser un zone de texte étendue avec un formulaire à l'intérieur de celui-ci. Je ne pense pas que c'est un bon design pour avoir un formulaire affiché/caché dans une zone de texte personnalisée.

+0

Merci pour cette deuxième suggestion, même si je préfère la première approche. Btw. Pour DataGridViews, vous devez appeler le formulaire à partir de DataGridViewTextBox. – tanascius

Questions connexes