表单上不同面板的不同AcceptButton

时间:2019-01-29 01:14:25

标签: c# .net winforms

我有一个带有 Search 按钮和 Submit 按钮的表单,它们位于不同的面板上,但格式相同。我想根据标准将AcceptButton的{​​{1}}属性与两个按钮一起使用。

用户将使用右侧面板上的框搜索故障单,该框将填充下面的datagridview。然后,用户将选择一行,我已将其绑定到左侧面板上的文本框。 “新资产”文本框为空白,因此用户在点击“提交”之前必须先进行填充。

如果新资产编号文本框为空,是否仍然可以将Form属性绑定到搜索文本框(右面板),然后在用户填充文本后将该属性绑定到提交按钮(左面板)框。

抱歉,这很难理解。我仍在学习c#及其可以做的所有事情。

snip it of app so you can get a better idea

1 个答案:

答案 0 :(得分:1)

  

注意:虽然我也认为可以改进问题案例中的UI设计,但是通常可以将页面不同部分具有多个默认按钮视为正常要求,例如html form个元素   如果您在任意位置按Enter,则应该运行其提交按钮代码   表单元素,而您可以在一个表单上拥有多个表单   页面。

您需要做的是覆盖ProcessDialogKey,并检查第一个面板是否包含焦点,然后单击第一个按钮;如果第二个面板包含焦点,然后单击第二个按钮:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (keyData == Keys.Enter)
    {
        if (panel1.ContainsFocus)
        {
            button1.PerformClick();
            return true;
        }
        if (panel2.ContainsFocus)
        {
            button2.PerformClick();
            return true;
        }
    }
    return base.ProcessDialogKey(keyData);
}

您还可以选择处理控件的Enter事件,并根据焦点控件分配表单的AcceptButton。但上方/下方  解决方案更通用,代码更少。

注意-创建具有AcceptButton属性的Panel类

除了上述解决方案之外,对于那些想用更少的代码来处理此类情况的人来说,它是可重用的解决方案,您可以使用具有AcceptButton属性的面板类:

using System.Windows.Forms;
public class MyPanel : Panel
{
    public Button AcceptButton { get; set; }
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            AcceptButton?.PerformClick();
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}