Все кнопки в моей форме, кажется, вызывают «что-то»

1

У меня есть форма окна, в которой все элементы управления создаются динамически.

Тем не менее, все кнопки, кажется, запускают "Что-то" перед событием клика, а "Кое-что" вызывает срабатывание 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.

Спасибо за ваше время.

  • 0
    Можете ли вы опубликовать минимальный, полный и проверяемый пример ?
  • 0
    Я бы хотел, но так как моя программа динамическая и сложная, и я не знаю, в чем проблема, я, скорее всего, буду публиковать весь мой код, который составляет около 5 000 строк. Я уверен, что ты тоже не хочешь проходить через это.
Показать ещё 1 комментарий
Теги:

1 ответ

0

Я сталкиваюсь с аналогичной проблемой, и причина кажется "дублирующимися" списками combobox (где текст одинаков, но значение не указано), и автозаполнение, которое я установил в combobox. У меня нет исправления, но проблема заключается в том, что все дочерние элементы формы могут быть проверены вместе, а триггеры проверки NotifyAutoComplete, которые затем могут изменить выбранный индекс.

Microsoft ссылается на эту проблему здесь https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.autocompletemode%28v=vs.110%29.aspx с комментарием "Если есть повторяющиеся записи в поддерживаемом источнике автоматическое завершение ведет себя непредсказуемо ".

Вот источник, чтобы вы могли понять, что происходит;

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ComboBox.cs,21e4308c05a79f0a

По сути, вызов ComboBox.OnValidating() проверяет, включено ли автоматическое завершение в поле со списком. Если это тогда, то предполагается, что мы проверяем, что пользователь печатает. OnValidating calls в NotifyOnComplete и пытается установить выбранный индекс, который выполняется путем сравнения текстовых значений. Это грубо и непросто обойти.

Мое исправление будет состоять в том, чтобы отключить автоматическое заполнение в своих списках, прежде чем я вызову Form.ValidateChildren(), который запускает эту бессмыслицу, а затем восстанавливает значения автозаполнения после проверки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню