C# 根据选定的numericUpDown控件更改AcceptButton

C# 根据选定的numericUpDown控件更改AcceptButton,c#,winforms,C#,Winforms,我有两个数字上下控制。让我们把一个命名为左,另一个命名为右。我有两个按钮也将被命名为左和右 最初,左按钮是AcceptButton 我想,如果用户将更改正确的numericUpDown,那么正确的按钮将是AcceptButton 我试图为numericUpDown控件的ValueChanged事件设置处理程序,但首先该控件传递给左按钮的Click事件,因为此时它是AcceptButton 那么,如何做到这样一种方式,当左键当前是AcceptButton,用户更改了Right numericUpD

我有两个数字上下控制。让我们把一个命名为左,另一个命名为右。我有两个按钮也将被命名为左和右

最初,左按钮是AcceptButton

我想,如果用户将更改正确的numericUpDown,那么正确的按钮将是AcceptButton

我试图为numericUpDown控件的ValueChanged事件设置处理程序,但首先该控件传递给左按钮的Click事件,因为此时它是AcceptButton

那么,如何做到这样一种方式,当左键当前是AcceptButton,用户更改了Right numericUpDown控件并按下Enter键时,右键将是AcceptButton,其处理程序将获得该控件


编辑:似乎没有人理解这个问题,所以我会再解释一次。当用户按下Enter键时,程序的控制首先传递给当前的AcceptButton,然后才传递给处理程序ValueChanged。因此,ValueChanged中AcceptButton的任何设置都是徒劳的,因为错误的按钮已获取控件。

对两个控件上的change事件使用公共事件处理程序,并借助“sender”参数确定实际的发送者。根据控件名称,可以激活按钮

    public Form1()
    {
        InitializeComponent();

        right_upDown.ValueChanged += new EventHandler(OnNumericUpDownValueChanged);
        left_upDown.ValueChanged += new EventHandler(OnNumericUpDownValueChanged);
        button_left.Click += new EventHandler(OnAcceptButtonClicked);
    }

    void OnAcceptButtonClicked(object sender, EventArgs e)
    {

    }

    void OnNumericUpDownValueChanged(object sender, EventArgs e)
    {
        if (sender == right_upDown)
        {
            this.AcceptButton = button_right;
            button_left.Click -= OnAcceptButtonClicked;  //Un-register the event from the left
            button_right.Click += new EventHandler(OnAcceptButtonClicked); //Register the event on the right
        }
        else
        {
            this.AcceptButton = button_left;
            button_right.Click -= OnAcceptButtonClicked; //Un-register the event from the right
            button_left.Click += new EventHandler(OnAcceptButtonClicked); //Register the event on the left
        }
    }
或者,如果您喜欢使用AcceptButton属性,也可以这样做:

    public Form1()
    {
        InitializeComponent();

        right_upDown.ValueChanged += new EventHandler(OnNumericUpDownValueChanged);
        left_upDown.ValueChanged += new EventHandler(OnNumericUpDownValueChanged);
        button_left.Click += new EventHandler(OnAcceptButtonClicked);
    }

    void OnAcceptButtonClicked(object sender, EventArgs e)
    {

    }

    void OnNumericUpDownValueChanged(object sender, EventArgs e)
    {
        this.AcceptButton -= OnAcceptButtonClicked;  //Un-register the event from the AcceptButton
        if (sender == right_upDown)
        {
            this.AcceptButton = button_right;
        }
        else
        {
            this.AcceptButton = button_left;
        }

        this.AcceptButton += new EventHandler(OnAcceptButtonClicked); //Register the event on new AcceptButton
    }

您是否在问如何按位置切换实际按钮控制?您是否可以在调用处理程序时更改它们的标签,然后检查当前值?如果你能提供更多关于你想要完成的事情的细节,也许有更好的方法。@JWiley我不改变标签。我想在两个按钮之间更改AcceptButton的状态,具体取决于使用了什么numericUpDown控件。您没有提供关于您尝试执行的操作的详细信息。更新您的问题,说明您所说的“右按钮将是AcceptButton”,在这种情况下左按钮会发生什么,以及您为AcceptButton定义了什么。您是否希望每次调用相同的处理程序,尽管按钮不同?您如何设置表单的“接受”按钮?@Vlad,来自莫斯科,请检查我的回答:)我认为这种方法没有任何意义。确定更改了什么numericUpDown控件没有问题。问题是,当使用的按Enter键时,错误的AcceptButton被激活。在这种情况下,您必须更改表单的默认按钮。您可以使用以下代码:
this.AcceptButton=btn_2
其中btn_2是您的按钮名。我在问题中解释了这不起作用。更新了包含事件处理程序在内的其他信息的帖子。还有一个不起作用。我在问题中解释了这一点。当用户第一次按Enter键时,控件将传递到当前的AcceptButton,并且只有在ValueChanged获得控件后,才会被传递。我确信这里存在语言问题,但您没有很好地解释。您是否正在某个地方注册AcceptButton上的单击事件?我更改了答案,以反映也需要更改活动注册。