2009-07-06 4 views
1

私はTextBoxを持っており、別のフォームからKeyPressイベントを転送したいと考えています。KeyPressイベントを転送する

これまでのところ、私は私のフォームがあります。

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

、フォームの初期化を導出テキストボックス、:今すぐ

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

を予想通り、ONKEYPRESS-方法は、フォームの(呼び出されます次にTextBoxの)。しかし、何も起こりません...私が 'a'を押すと、 'a'がTextBoxに表示されることを期待しています...

ここで何が問題なのでしょうか?

KeyDownとは動作しません。定期的に公開されているイベントKeyPressに付いてもお手伝いしません。私は、問題はOnKeyPressの明示的な呼び出しだと思います。許可されていますか?

+0

なぜdownvoteですか?それは良い質問です。 –

答えて

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

あなたの提案をありがとう。それは少なくとも普通の文字のために働く - 私はチェックを追加しましたif(char.IsLetterOrDigit(e.KeyChar));しかし、なぜOnKeyPress()メソッドを呼び出せないのかまだ分かりません。 Backspaceのような特殊文字でも転送されるという利点があります。 – tanascius

+0

問題はフォームが自動的にkeypressイベントをテキストボックス自体に転送しないことです。上記のf_mEventをこれに変更することができます: textBox1.Focus(); SendKeys.Send(e.KeyChar.ToString()); これは、フォームが現在フォーカスを奪ってしまうという欠点がありますが、バックスペースは機能します – SwDevMan81

+0

2つのフォームを使用していると仮定していますが、フォームを初期化する1つのフォームと派生TextBoxのみを使用します。派生したTextBoxは、そのOnKeyPress()メソッドにアクセスできます。問題は、私がこの関数を呼び出すと何も起こらないということです。 – tanascius

1

これは、あなたが欲しいものを行う必要があります。キーボードフォームのボタンのテキストをSendKey charactersに基づいて作成します。たとえば、小文字aを使用する場合は、キーボードボタンのテキストに "a"を入力します。バックスペースボタンが必要な場合は、ボタンのテキストとして「バックスペース」を入れてください。すべてのキーボードボタンは、イベントがButtonClick機能を登録することができます

キーボードフォーム:

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

注:私は使用していなかったにユーザタイプのものは、テキストボックスと

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

フォーム内部にフォームを持つ拡張テキストボックス。私は、フォームをカスタムテキストボックスから表示したり非表示にしたりするのは良いデザインだとは思わない。

+0

この2番目の提案をありがとう、私は最初のアプローチを好むが。 Btw。 DataGridViewの場合は、DataGridViewTextBox内からフォームを呼び出す必要があります。 – tanascius

関連する問題