ComboBox Windows Form запускает события SelectionChangeCommitted, SelectedValueChanged и SelectedIndexChanged, когда приложение теряет фокус - PullRequest
2 голосов
/ 20 августа 2010

У меня есть .Net 2.0 форма Windows, содержащая комбобоксы. Я написал следующий код для заполнения поля со списком, а затем связал его со свойством ProductType типа Int.

// Populate Combo

cmbProduct.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
cmbProduct.DataSource = new DataView(productDataSet.Tables[0]);
cmbProduct.DisplayMember = displayColumnName_;
cmbProduct.ValueMember = idColumnaName_;

// Add Databindings

cmbProduct.DataBindings.Add("SelectedValue", this, "ProductType").DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;

ВЫПУСКА

  1. Запустить приложение.
  2. Нажмите на стрелку раскрывающегося списка ComboBox, но не выбирайте ничего.
  3. Нажмите любую клавишу (например, ALT + TAB, Windows Key и т. Д.), Которая сместит фокус с текущего приложения формы Windows.

Это вызывает исключение и сбой приложения. Ниже приведены сведения, взятые из окна «Вывод».

Произошло первое исключение типа System.ArgumentException в System.Windows.Forms.dll Объект типа 'System.DBNull' не может быть преобразован в тип 'System.Int32'. в System.ComponentModel.ReflectPropertyDescriptor.SetValue (Объект компонент, значение объекта) в System.Windows.Forms.BindToObject.SetValue (значение объекта) в System.Windows.Forms.Binding.PullData (логическое переформатирование, логическая сила) в System.Windows.Forms.Binding.Target_PropertyChanged (Отправитель объекта, EventArgs e) в System.EventHandler.Invoke (Отправитель объекта, EventArgs e) в System.Windows.Forms.ListControl.OnSelectedValueChanged (EventArgs e) в System.Windows.Forms.ComboBox.OnSelectedValueChanged (EventArgs e) в System.Windows.Forms.ComboBox.OnSelectedIndexChanged (EventArgs e) в System.Windows.Forms.ComboBox.WmReflectCommand (Message & m) в System.Windows.Forms.ComboBox.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.SendMessage (HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) в System.Windows.Forms.Control.SendMessage (Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.Control.ReflectMessageInternal (IntPtr hWnd, Message & m) в System.Windows.Forms.Control.WmCommand (Message & m) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ScrollableControl.WndProc (Message & m) в System.Windows.Forms.ContainerControl.WndProc (Message & m) в System.Windows.Forms.Form.WndProc (сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc (IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) в System.Windows.Forms.NativeWindow.DefWndProc (Message & m) в System.Windows.Forms.Control.DefWndProc (сообщение & m) в System.Windows.Forms.Control.WmCommand (Message & m) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ComboBox.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.PeekMessage (MSG & msg, HandleRef hwnd, Int32 msgMin, Int32 msgMax, Int32 удалить) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, причина Int32, pvLoopData Int32) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Int32 причина, контекст ApplicationContext)в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.Run (форма mainForm)

Я добавил некоторую отладочную статистику в обработчики событийпроверить последовательность событий.Окна выходного окна имеют следующий вид:

cmbProduct_SelectionChangeCommitted occured - SelectedValue is NULL
cmbProduct_SelectedValueChanged occured - New SelectedValue is NULL
The thread 0x1728 has exited with code 0 (0x0).
cmbProduct_SelectedIndexChanged occured - New SelectedIndex is -1
The thread 0x1250 has exited with code 0 (0x0).

Вопрос

Почему .Net запускает события SelectionChangeCommitted, SelectedValueChanged и SelectedIndexChanged, когда приложениетеряет фокус со списком, состояние ОТКРЫТО?

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Код выглядит идеально.Проблема может быть из-за ошибки в .net Framework.Может ли какой-нибудь эксперт подтвердить это?

Один из способов избежать исключения - сохранить значение по умолчанию свойства «ProductType», если SelectedValue равно NULL.

Например, если значение по умолчанию для ProductType равно -1,

cmbProduct.DataBindings["SelectedValue"].DataSourceNullValue = -1; 

Надеюсь, это поможет!

Робин

0 голосов
/ 24 февраля 2011

Звучит так, как будто вы задаете не тот вопрос: «Почему комбо совершает коммит на потерю фокуса?» а не «Почему выбрасывается исключение?»

Робин правильно ответил на важный.

Пользователю не нужно выполнять запутанные 3 шага, которые вы предоставили, чтобы увидеть исключение - простой выбор ошибочного (нулевого) индекса вызовет его.

...