C# 根据选定的numericUpDown控件更改AcceptButton
我有两个数字上下控制。让我们把一个命名为左,另一个命名为右。我有两个按钮也将被命名为左和右 最初,左按钮是AcceptButton 我想,如果用户将更改正确的numericUpDown,那么正确的按钮将是AcceptButton 我试图为numericUpDown控件的ValueChanged事件设置处理程序,但首先该控件传递给左按钮的Click事件,因为此时它是AcceptButton 那么,如何做到这样一种方式,当左键当前是AcceptButton,用户更改了Right numericUpDown控件并按下Enter键时,右键将是AcceptButton,其处理程序将获得该控件C# 根据选定的numericUpDown控件更改AcceptButton,c#,winforms,C#,Winforms,我有两个数字上下控制。让我们把一个命名为左,另一个命名为右。我有两个按钮也将被命名为左和右 最初,左按钮是AcceptButton 我想,如果用户将更改正确的numericUpDown,那么正确的按钮将是AcceptButton 我试图为numericUpDown控件的ValueChanged事件设置处理程序,但首先该控件传递给左按钮的Click事件,因为此时它是AcceptButton 那么,如何做到这样一种方式,当左键当前是AcceptButton,用户更改了Right numericUpD
编辑:似乎没有人理解这个问题,所以我会再解释一次。当用户按下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上的单击事件?我更改了答案,以反映也需要更改活动注册。