C# 窗体上不同面板的不同AcceptButton

C# 窗体上不同面板的不同AcceptButton,c#,.net,winforms,C#,.net,Winforms,我有一个带有搜索按钮和提交按钮的表单,它们位于不同的面板上,但形式相同。我希望根据条件将表单的AcceptButton属性用于两个按钮 用户将使用右面板上的框搜索票证,该框将填充下面的datagridview。然后,用户将选择一行,我已将其绑定到左侧面板上的文本框中。新资产文本框为空,因此用户必须在点击提交之前填充该文本框 如果新资产编号文本框为空,是否仍可以将AcceptButton属性绑定到搜索文本框右面板,然后在用户填充文本框后将属性绑定到submit按钮左面板 很抱歉,这很难理解。我仍然

我有一个带有搜索按钮和提交按钮的表单,它们位于不同的面板上,但形式相同。我希望根据条件将表单的AcceptButton属性用于两个按钮

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

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

很抱歉,这很难理解。我仍然在学习c语言以及我能用它做的所有事情

注意:虽然我也相信问题案例中的UI设计可以改进,但一般来说,为页面的不同部分提供多个默认按钮可以被视为一项正常要求,就像html表单元素 如果您在任何位置按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属性的面板类

除了上述解决方案之外,对于那些希望用更少的代码处理此类情况的人来说,作为一个更可重用的解决方案,您可以使用具有AcceptButton属性的panel类:

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);
    }
}

你没有足够准确地描述你想要的东西来确定一个合理的答案。什么是accept按钮属性?如果您试图让一个按钮执行两个不同的操作,这可能不是一个好主意。Acceptbutton是表单的一个属性,它将按钮绑定到enter键?这是我对问题的理解:表单上有两组控件。每个集合都有自己的默认按钮,OP正在寻找一种方法来触发与活动控件集合相关的默认按钮。当任何左侧控件有焦点时提交到左侧面板,当搜索框有焦点时搜索到右侧面板。将详细输入作为单独的模式呈现可能会更容易混淆?表单,而不是更改键的作用-如果他们决定退出,但已经填写了信息,该怎么办?他们去做另一个搜索,完全改变搜索文本,点击输入和提交代替!您需要检查是否填充了New Asset文本框,以便根据问题决定单击哪个按钮。虽然可以轻松地将代码添加到ProcessDialogKey方法中,但我个人更喜欢保持干净并分离关注点,因此我将所有验证放在Validating events中,例如,处理textBox1.Validating事件并设置e.Cancel=string.IsNullOrEmptytextBox1.Text;。您也可以将其与ErrorProvider混合使用。让我们让答案更一般,对未来的读者更有用。非常好@RezaAghaei-感谢!