C#Gui设置control.Enabled to false fires OnClick事件?

时间:2010-04-01 00:26:45

标签: c# user-interface controls events

出于一些非常奇怪的原因,当我在一个小GUI上的简单文本框中将.Enabled属性设置为false时,它会触发一个单选按钮OnClick事件,并导致很多问题。

我打破了txtBox.Enabled = false;在踩到OR后,我直接跳到单选按钮控件的OnClick事件

这是发生的调用堆栈:

  

TestGUI.exe!TestGUI.frmMain.radiobuttonClicked(object sender = {Text =“Download Single Episode”Checked = true},System.EventArgs e = {System.EventArgs})第67行C#     System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick(System.EventArgs e)+ 0x70 bytes     System.Windows.Forms.dll!System.Windows.Forms.RadioButton.OnClick(System.EventArgs e)+ 0x27 bytes     System.Windows.Forms.dll!System.Windows.Forms.RadioButton.OnEnter(System.EventArgs e = {System.EventArgs})+ 0x3e bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.NotifyEnter()+ 0x20 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.UpdateFocusedControl()+ 0x195 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.AssignActiveControlInternal(System.Windows.Forms.Control value = {Text =“Download Single Episode”Checked = true})+ 0x54 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ActivateControlInternal(System.Windows.Forms.Control control,bool originator = false)+ 0x76 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.SetActiveControlInternal(System.Windows.Forms.Control value = {Text =“Download Single Episode”Checked = true})+ 0x73 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.SetActiveControl(System.Windows.Forms.Control ctl)+ 0x33 bytes     System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ActiveControl.set(System.Windows.Forms.Control value)+ 0x5 bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.Select(bool directed,bool forward)+ 0x1b bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.SelectNextControl(System.Windows.Forms.Control ctl,bool forward,bool tabStopOnly,bool nested,bool wrap)+ 0x7b bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.SelectNextControlInternal(System.Windows.Forms.Control ctl,bool forward,bool tabStopOnly,bool nested,bool wrap)+ 0x4a bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.SelectNextIfFocused()+ 0x61 bytes     System.Windows.Forms.dll!System.Windows.Forms.Control.Enabled.set(bool value)+ 0x42 bytes

到底是什么?

这与我订阅活动的方式没有任何关系吗?

this.radioBtnMultipleDownload.Click += radiobuttonClicked;  this.radioBtnSingleDownload.Click += radiobuttonClicked;  this.radioCustomUrl.Click += radiobuttonClicked;

3 个答案:

答案 0 :(得分:2)

调用堆栈的倒数第二行:

  

System.Windows.Forms.dll中!System.Windows.Forms.Control.SelectNextIfFocused()   + 0x61字节

显然,RadioButton在其OnClicked上触发OnEnterUpdateFocusedControl从其Control.Focus()触发,因为这是下一个控件。您可以尝试在TextBox被禁用之前调用SelectNextIfFocused()关于您希望获得焦点的其他内容,以便dummyTextBox.Focus(); txtBox.Enabled = false; 不会执行任何操作,即:

{{1}}

答案 1 :(得分:0)

TextBox具有EnabledChanged属性。你确定你不是在某个地方做这个吗?

this.textBox1.EnabledChanged += radiobuttonClicked;

另一种可能性是你已经连接到TextBox的LostFocus事件,如果TextBox在禁用它时具有焦点,它将触发。或者你可能已经迷上了其他控件的GotFocus事件,如果TextBox在禁用它时具有焦点,它也会触发。

答案 2 :(得分:0)

快速注意 - 不是真正的解决方案,而是提供一些提示:我在一个非常静态的对话框中遇到了同样的问题,没有任何EnabledChanged处理程序或调用,事实上即使没有任何事件处理程序分配给我的RadioButtons。没有数据绑定或其他黑魔法。

SelectNextIfFocused似乎只是因为它们是控件的Tab键顺序中的第一个而触及ShowDialog中的那些按钮,尽管它们嵌套在GroupBox内的TableLayoutPanel中。这导致错误的RadioButton被检查。由于对话框的Tab键顺序是歪斜的,我先改变了它。

这似乎解决了我的问题。但你也可以尝试类似的东西,即在你的控件中插入一些空标签,让它接收SelectNextIfFocused产生的事件。