首页 > 解决方案 > 用户控件 C# 按键

问题描述

我创建了一个用户控件。此用户控件有 1 个文本框和 1 个按钮。

我的用户控件

    private void textBoxCombo_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
            buttonCombo_Click(null, null);
    }

    private void buttonCombo_Click(object sender, EventArgs e)
    {
        Execute some tasks!!
    }

我有两种形式:父亲形式和继承形式。

父表单代码:Keypreview 设置为 true

            protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter || e.KeyChar == (char)Keys.Escape)
            e.Handled = true;   // stop annoying beep

        // call base handler...
        base.OnKeyPress(e);
    }

    private void formBase_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
            SelectNextControl(ActiveControl, !e.Shift, true, true, true);
    }

继承表单 - 在我的表单中有 3 个组件:1 个 TextBox、1 个 MyUserControl 和 1 个 ComboBox。

当我继承的表单开始时,光标是文本框中的焦点。如果我按 ENTER,焦点将变为 MyUserControl。如果我再次按 ENTER,焦点将变为 ComboBox。

但是这个组合框将在我的用户控件中填充数据过程。

问题就在这里...

当光标位于我的用户控件的文本框中时。如果我按 ENTER,我的用户控件将执行单击按钮,并且表单会将焦点更改为下一个组件 .. 组合。但是组合在完成按钮单击过程之前获得焦点,然后组合现在没有数据。

如何控制这个?

标签: c#winforms

解决方案


在父窗体上设置KeyPress事件,
不要忘记将KeyPreview属性设置为TRUE.
该事件将调用用户控件中的一个公共方法,该方法将执行对按钮的单击。

例如:

表格1:

不要忘记将KeyPreview属性设置为 TRUE。

 // User control will be decleared globaly
 private UserControl1 MyUserControl;
 // Called from the load event for example
 private void  UserControlDefinitions()
 {
     MyUserControl = new UserControl1();
     MyUserControl.Location = new Point(5, 5);
     this.Controls.Add(MyUserControl);
 }


 private void Form1_KeyPress(object sender, KeyPressEventArgs e)
 {
     if (e.KeyChar == (char)13)
     {
         if (MyUserControl != null)
         {
             MyUserControl.EnterWasClickedFromOutside();
         }
     }
 }

用户控制:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
    public void EnterWasClickedFromOutside()
    {
        button1.PerformClick();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Enter Key Was Pressed In Form1");
        // Do something...
    }
}

推荐阅读