У меня есть форма окна, в которой все элементы управления создаются динамически.
Тем не менее, все кнопки, кажется, запускают "Что-то" перед событием клика, а "Кое-что" вызывает срабатывание selectedindexchanged из моих списков. Я полностью прошел через обработчики событий, и убедился, что ни одна из кнопок не имеет SIC, который был изменен как их события.
Я заметил, что обычное поведение при нажатии кнопки с помощью мыши состоит в том, что при нажатии кнопки, но удерживаемой и отпускаемой в области за пределами кнопки, кнопка не запускается.
Интересно, что в моем случае сам клик запускает "Что-то" еще до того, как нажатие будет отпущено.
Может ли кто-нибудь посоветовать, что происходит с моими кнопками?
Вот события InteliTrace, которые я действительно не понимаю:
Calls for thread <No Name> (6976)
[System.Threading.ThreadHelper.ThreadStart()]
SESAdminForm.My.MyApplication.Main(String() Args = {String(0)})
[Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(string[] commandLine = {unknown})]
System.Windows.Forms.Application.Run(System.Windows.Forms.ApplicationContext context = {unknown})
ThreadContext.RunMessageLoop(int reason = {unknown}, System.Windows.Forms.ApplicationContext context = {unknown})
ThreadContext.RunMessageLoopInner(int reason = {unknown}, System.Windows.Forms.ApplicationContext context = {unknown})
ThreadContext.RunMessageLoopInner(int reason = {unknown}, System.Windows.Forms.ApplicationContext context = {unknown})
System.Windows.Forms.NativeWindow.DebuggableCallback(System.IntPtr hWnd = {unknown}, int msg = {unknown}, System.IntPtr wparam = {unknown}, System.IntPtr lparam = {unknown})
ControlNativeWindow.WndProc(ref System.Windows.Forms.Message m = {unknown})
ControlNativeWindow.OnMessage(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Button.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.ButtonBase.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Control.WmMouseDown(ref System.Windows.Forms.Message m = {unknown}, System.Windows.Forms.MouseButtons button = {unknown}, int clicks = {unknown})
System.Windows.Forms.Control.FocusInternal()
System.Windows.Forms.NativeWindow.DebuggableCallback(System.IntPtr hWnd = {unknown}, int msg = {unknown}, System.IntPtr wparam = {unknown}, System.IntPtr lparam = {unknown})
ControlNativeWindow.WndProc(ref System.Windows.Forms.Message m = {unknown})
ControlNativeWindow.OnMessage(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Button.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.ButtonBase.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Control.WndProc(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.Control.WmSetFocus(ref System.Windows.Forms.Message m = {unknown})
System.Windows.Forms.ContainerControl.ActivateControlInternal(System.Windows.Forms.Control control = {unknown})
System.Windows.Forms.ContainerControl.ActivateControlInternal(System.Windows.Forms.Control control = {unknown}, bool originator = {unknown})
System.Windows.Forms.ContainerControl.AssignActiveControlInternal(System.Windows.Forms.Control value = {unknown})
System.Windows.Forms.ContainerControl.UpdateFocusedControl()
System.Windows.Forms.ContainerControl.EnterValidation(System.Windows.Forms.Control enterControl = {unknown})
System.Windows.Forms.ContainerControl.ValidateThroughAncestor(System.Windows.Forms.Control ancestorControl = {unknown}, bool preventFocusChangeOnError = {unknown})
System.Windows.Forms.Control.PerformControlValidation(bool bulkValidation = {unknown})
System.Windows.Forms.Control.NotifyValidating()
System.Windows.Forms.ComboBox.OnValidating(System.ComponentModel.CancelEventArgs e = {unknown})
System.Windows.Forms.ComboBox.NotifyAutoComplete()
System.Windows.Forms.ComboBox.NotifyAutoComplete(bool setSelectedIndex = {unknown})
Set System.Windows.Forms.ComboBox.SelectedIndex(int value = {unknown})
System.Windows.Forms.ComboBox.OnSelectedIndexChanged(System.EventArgs e = {unknown})
SESAdminForm.DataEntry.cBox_SelectionChangeCommittedUseItem2(Object sender = {System.Windows.Forms.ComboBox}, System.EventArgs e = {System.EventArgs})
SESAdminForm.DataEntry.DisplayText()
→ Есть 2 сообщения, связанные с кнопкой, но, похоже, это происходит даже до события mousedown.
Спасибо за ваше время.
Я сталкиваюсь с аналогичной проблемой, и причина кажется "дублирующимися" списками combobox (где текст одинаков, но значение не указано), и автозаполнение, которое я установил в combobox. У меня нет исправления, но проблема заключается в том, что все дочерние элементы формы могут быть проверены вместе, а триггеры проверки NotifyAutoComplete, которые затем могут изменить выбранный индекс.
Microsoft ссылается на эту проблему здесь https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.autocompletemode%28v=vs.110%29.aspx с комментарием "Если есть повторяющиеся записи в поддерживаемом источнике автоматическое завершение ведет себя непредсказуемо ".
Вот источник, чтобы вы могли понять, что происходит;
По сути, вызов ComboBox.OnValidating() проверяет, включено ли автоматическое завершение в поле со списком. Если это тогда, то предполагается, что мы проверяем, что пользователь печатает. OnValidating calls в NotifyOnComplete и пытается установить выбранный индекс, который выполняется путем сравнения текстовых значений. Это грубо и непросто обойти.
Мое исправление будет состоять в том, чтобы отключить автоматическое заполнение в своих списках, прежде чем я вызову Form.ValidateChildren(), который запускает эту бессмыслицу, а затем восстанавливает значения автозаполнения после проверки.