出于一些非常奇怪的原因,当我在一个小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;
答案 0 :(得分:2)
调用堆栈的倒数第二行:
System.Windows.Forms.dll中!System.Windows.Forms.Control.SelectNextIfFocused() + 0x61字节
显然,RadioButton
在其OnClicked
上触发OnEnter
,UpdateFocusedControl
从其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产生的事件。