将KeyDown事件传递给其他控件

时间:2014-12-16 15:23:11

标签: c# .net winforms keydown

我正在编写一个C#WinForms应用程序,.NET 4.0。

我在Control上有一个WinForms Form。用户开始使用键盘输入内容后,会出现另一个ControlControl是某种文本输入。我想将用户输入发送到Control。当然,在它聚焦后,它会接收所有用户键盘输入。但是,当用户在显示Control之前开始输入时,我必须先将KeyDown事件传递给该控件,我将其称为ShowFocus方法。

SendKeys.Send method是一种做类似事情的方式。但这太复杂了,似乎不安全。我只有来自Keys KeyData属性的KeyEventArgs枚举值,我想使用它,而不是将其转换为某个奇怪的字符串。

有没有什么好方法可以将KeyDown事件从一个控件传递到另一个控件?

3 个答案:

答案 0 :(得分:3)

您可以PreviewKeyDown使用Form

假设您要将键盘输入发送到TextBox textBox1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.PreviewKeyDown+= Form1_OnPreviewKeyDown;
        textBox1.Visible = false;
    }

    private bool _textboxEnable = false;
    private void Form1_OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs previewKeyDownEventArgs)
    {
        if (!_textboxEnable) textBox1.Visible = true;
        if (!textBox1.Focused) textBox1.Focus();
    }
}

答案 1 :(得分:2)

您无法将该事件传递给"子控件" ?下面的示例是KeyPress,但同样的想法适用于KeyDown

//Parent Control Visible
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    richTextBox1_KeyPress(sender, e);
}
//Child Control Hidden
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    richTextBox1.Text += e.KeyChar.ToString();
}

答案 2 :(得分:0)

您可以创建一个继承文本框的自定义控件。你可以放置那个自定义控件。在该自定义控件中,您可以编写一个调用它的方法:

public class MyTextBox : TextBox
{
    public void TriggerKeyPress(KeyPressEventArgs e)
    {
        this.OnKeyPress(e);
    }
}

如果您不想使用自定义控件,可以对文本框进行扩展并使用反射来调用它:

public static class TextBoxExtensions{
    public static void TriggerKeyPress(this TextBox textbox, KeyPressEventArgs e)
    {
        MethodInfo dynMethod = textbox.GetType().GetMethod("OnKeyPress", 
        BindingFlags.NonPublic | BindingFlags.Instance);
        dynMethod.Invoke(textbox, new object[]{ e });
    }
}

但是使用这两种方法你应该知道:这不会将文本从一个对象添加到另一个对象。为此,您必须手动在代码中编写它。