【问题标题】:UserControl C# KeyPress用户控件 C# 按键
【发布时间】:2020-06-26 02:02:06
【问题描述】:

我创建了一个用户控件。这个用户控件有 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,我的用户控件将执行单击按钮,并且表单会将焦点更改为下一个组件 .. 组合。但是combo在完成按钮单击过程之前获得焦点,然后combo现在没有数据。

如何控制?

【问题讨论】:

  • 很难理解是什么问题。您可能需要详细了解哪些情况未按预期工作。此外,没有一些代码可供参考,猜测和更多问题都是关于你可能得到的。我建议至少发布用户控件代码并发布组合框与用户控件的关系。我建议您仔细阅读 SO Help 部分。在这种情况下,How do I ask a good question? 可能有用。
  • "但是combo在完成按钮点击过程之前获得了焦点",这里你说的是哪个按钮点击,回车键按钮?
  • 我的用户控件中的按钮。当我在我的用户控件中输入 enter 时执行的相同按钮。
  • 做一个测试,看看没有这条线e.Handled = true;是否可以工作。如果没有那条线它仍然无法工作,我认为formBase_KeyDown 不是正确的地方,我认为你想要KeyUp 事件。

标签: c# winforms


【解决方案1】:

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

例如:

Form1:

不要忘记将 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...
    }
}

【讨论】:

  • 我更改了我的问题的描述...您现在可以验证吗?
【解决方案2】:

当活动控件是您的用户控件类型时,您可以使您的表单不前进:

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

然后在你的 UserControl 中,你可以在你的按钮完成它的事情后让表单向前移动:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        button1.PerformClick();
    }            
}

private void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("Button1 in UserControl");
    Form frm = this.ParentForm;
    frm.SelectNextControl(frm.ActiveControl, true, true, true, true);
}

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多