C # Gui настройки элемента управления. Включено ложное срабатывание события OnClick? - PullRequest
1 голос
/ 01 апреля 2010

По какой-то очень странной причине, когда я устанавливаю для свойства .Enabled значение false в простом текстовом поле в небольшом графическом интерфейсе, оно запускает событие OnClick для радиокнопок и вызывает много проблем.

У меня есть точка останова txtBox.Enabled = false; и после перехода ИЛИ в него я прыгаю прямо к событию OnClick переключателя радиокнопок

Вот стек вызовов, как это произошло:

TestGUI.exe! TestGUI.frmMain.radiobuttonClicked (отправитель объекта = {Text = "Скачать одиночный эпизод" отмечен = true}, System.EventArgs e = {System.EventArgs}) Строка 67 C # System.Windows.Forms.dll! System.Windows.Forms.Control.OnClick (System.EventArgs e) + 0x70 байт System.Windows.Forms.dll! System.Windows.Forms.RadioButton.OnClick (System.EventArgs e) + 0x27 байт System.Windows.Forms.dll! System.Windows.Forms.RadioButton.OnEnter (System.EventArgs e = {System.EventArgs}) + 0x3e байт System.Windows.Forms.dll! System.Windows.Forms.Control.NotifyEnter () + 0x20 байт System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.UpdateFocusedControl () + 0x195 байт System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.AssignActiveControlInternal (System.Windows.Forms.Control value = {Text = "Загрузить одиночный эпизод" Checked = true}) + 0x54 байта System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.ActivateControlInternal (элемент управления System.Windows.Forms.Control, инициатор bool = false) + 0x76 байт System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.SetActiveControlInternal (System.Windows.Forms.Control value = {Text = "Загрузить отдельный эпизод" Checked = true}) + 0x73 байта System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.SetActiveControl (System.Windows.Forms.Control ctl) + 0x33 байта System.Windows.Forms.dll! System.Windows.Forms.ContainerControl.ActiveControl.set (значение System.Windows.Forms.Control) + 0x5 байт System.Windows.Forms.dll! System.Windows.Forms.Control.Select (bool направлено, bool forward) + 0x1b байт System.Windows.Forms.dll! System.Windows.Forms.Control.SelectNextControl (System.Windows.Forms.Control ctl, bool forward, bool tabStopOnly, вложенная bool, перенос bool) + 0x7b байт System.Windows.Forms.dll! System.Windows.Forms.Control.SelectNextControlInternal (System.Windows.Forms.Control ctl, bool forward, bool tabStopOnly, вложенная bool, перенос bool) + 0x4a байт System.Windows.Forms.dll! System.Windows.Forms.Control.SelectNextIfFocused () + 0x61 байт System.Windows.Forms.dll! System.Windows.Forms.Control.Enabled.set (значение bool) + 0x42 байта

Какого черта?

Это никак не связано с тем, как я подписываюсь на события, не так ли?

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

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

От второй до последней строки вашего стека вызовов:

System.Windows.Forms.dll! System.Windows.Forms.Control.SelectNextIfFocused () + 0x61 байт

Очевидно, RadioButton запускает OnClicked на своем OnEnter, который срабатывает на UpdateFocusedControl, что происходит потому, что это следующий элемент управления. Вы можете попытаться вызвать Control.Focus() на что-то еще, что вы хотите получить фокус, прежде чем TextBox отключен, так что SelectNextIfFocused() ничего не будет делать, например:

dummyTextBox.Focus();
txtBox.Enabled = false;
0 голосов
/ 17 июля 2014

Быстрое примечание - не совсем решение, но дает некоторые подсказки: я просто столкнулся с той же проблемой в довольно статичном диалоге без каких-либо обработчиков или вызовов EnabledChanged, фактически даже без каких-либо обработчиков событий, назначенных моим RadioButton. И нет привязки данных или другой черной магии.

Кажется, что SelectNextIfFocused нажимает эти кнопки внутри ShowDialog только потому, что они были первыми в порядке вкладок элемента управления, хотя и вложены в TableLayoutPanel внутри GroupBox. Это привело к неправильной проверке RadioButton. И поскольку порядок вкладок в диалоговом окне был изменен, я сначала изменил его.

Это, похоже, решило проблему для меня. Но вы также можете попробовать что-то похожее, то есть вставить некоторую пустую метку в ваши элементы управления, чтобы она получала события, возникающие в результате SelectNextIfFocused.

0 голосов
/ 01 апреля 2010

TextBox имеет свойство EnabledChanged. Вы уверены, что не делаете это где-то?

this.textBox1.EnabledChanged += radiobuttonClicked;

Другая возможность заключается в том, что вы подключились к событию LostFocus TextBox, которое будет срабатывать, если у TextBox будет фокус при отключении. Или, может быть, вы подключились к событию GotFocus какого-то другого элемента управления, которое также сработало бы, если бы у TextBox был фокус при отключении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...