【问题标题】:Keypress event for dynamically created winform in C#在 C# 中动态创建的 winform 的按键事件
【发布时间】:2014-09-16 05:10:11
【问题描述】:

我正在运行时创建一个 Windows 窗体。现在我希望为动态创建的表单触发 Key-press 事件。 如何在 C# 中创建/绑定事件到新/动态创建的窗口窗体。

谢谢,

【问题讨论】:

  • 按哪种控制键?
  • 如“Ctrl + C”或“Ctrl + V”
  • 您可以通过查看Seminda 或Shujaat 的答案找到有关如何处理按键的示例。更多文档:msdn.microsoft.com/en-us/library/…

标签: c# .net windows keypress


【解决方案1】:

如果我们把一个文本框变成这样。

    private void Form1_Load(object sender, EventArgs e)
    {
        TextBox myTextBox = new TextBox();
        myTextBox.KeyPress += new KeyPressEventHandler(myTextBox_KeyPress);

        this.Controls.Add(myTextBox);
    }

    void myTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        //Do Key press event work here
    }

更新

确保焦点应该在Form2

【讨论】:

  • 尝试了相同的代码..但仍然没有触发事件。
【解决方案2】:

试试这个。

Form dynamicForm = new Form();

dynamicForm.KeyPress += new KeyEventHandler(onkeyPress);    


 void onkeyPress(object sender, KeyEventArgs e)
 {
        Console.WriteLine("test");
 }

【讨论】:

  • 尝试了相同的代码..但仍然没有触发事件。在选项卡控件上,放置动态生成的表单。甚至尝试了选项卡控件的按键事件......但仍然相同......
【解决方案3】:

确保表单 KeyPreview Property 设置为 true,这样它就会看到击键。

从上面的链接:

当此属性设置为 true 时,表单将接收所有 KeyPress、KeyDown 和 KeyUp 事件。在窗体的事件处理程序完成对击键的处理之后,击键被分配给具有焦点的控件。例如,如果 KeyPreview 属性设置为 true,并且当前选定的控件是 TextBox,则在表单的事件处理程序处理击键后,TextBox 控件将接收被按下的键。要仅在表单级别处理键盘事件并且不允许控件接收键盘事件,请将表单的 KeyPress 事件处理程序中的 KeyPressEventArgs.Handled 属性设置为 true。

所以你会想做这样的事情:

public partial class Form1 : Form
{
    Form2 f2;
    public Form1()
    {
        InitializeComponent();
        KeyPreview = true;
        KeyDown += Form1_KeyDown;
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.Control)
        {
            switch(e.KeyCode)
            {
                case Keys.C:
                    MessageBox.Show("Cntrl C");
                    break;
                case Keys.V:
                    MessageBox.Show("Cntrl V");
                    break;
                default:
                    break;
            }
        }
    }
}

【讨论】:

  • 即使在 KeyPreview 属性设置为 true 之后.. 仍然存在相同的问题.. 存在。
  • 不确定你的问题是什么,而不看你是如何实现它的。我给你的代码是工作代码
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多