2009-07-06 2 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); 
} 

и производный TextBox, который инициализирует форму:

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

Спасибо за ваше предложение. Он работает хотя бы для нормальных характеристик - я добавил чек, если (char.IsLetterOrDigit (e.KeyChar)); Но я до сих пор не знаю, почему метод OnKeyPress() не может быть вызван. Преимущество заключалось бы в том, что даже специальные символы, такие как Backspace, пересылаются. – tanascius

+0

Проблема заключается в том, что форма не будет автоматически пересылать события нажатия клавиш в текстовое поле. Вы можете изменить f_mEvent выше: textBox1.Focus(); SendKeys.Send (e.KeyChar.ToString()); У этого недостатка есть форма, в которой теперь крадут фокус, но будут работать обратные области – SwDevMan81

+0

Вы предполагаете, что я использую две формы - но я использую только одну форму и производный текстовый блок, который инициализирует форму. Полученный TextBox имеет доступ к его методу OnKeyPress(). Проблема в том, что ничего не происходит, когда я вызываю эту функцию. – tanascius

1

Это должно делать то, что вы хотите. Сделайте текст кнопок в форме клавиатуры на основе SendKey characters. Например, если вы хотите использовать нижний регистр a, просто поместите «a» для текста кнопки клавиатуры. Если вы хотите кнопку backspace, просто поместите «backspace» в качестве текста кнопки. Все кнопки клавиатуры Нажмите событие может зарегистрироваться для функции ButtonClick

клавиатуры Форма:

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

форма с текстовым полем, что пользователь вводит вещи в:

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

Примечания: Я не использовали расширенный текстовый ящик с формой внутри него. Я не думаю, что его хороший дизайн, чтобы форма была показана/скрыта из пользовательского текстового поля.

+0

Спасибо за это второе предложение, хотя я предпочитаю первый подход. Btw. для DataGridViews вы должны вызывать форму из DataGridViewTextBox. – tanascius

Смежные вопросы