Недавно я воспроизвел странное поведение этого сообщения в моей Windows 7. Может быть, это функция, и может быть, это не зависит от Windows 7, пожалуйста, исправьте меня, если это правильное поведение. В MSDN мы видимНастройка SelectedIndex в ComboBox DropDown обработчик событий
Приложение отправляет сообщение CB_SETCURSEL , чтобы выбрать строку в списке комбинированного блока. При необходимости список прокручивает строку в виде. Текст в элементе управления редактирования поля со списком изменяется, чтобы отразить новый выбор, и любой предыдущий выбор в списке удален.
Фрагмент кода ниже описывает горячие воспроизвести поведение:
private void ReproduceBehaviour()
{
ComboBox comboBox = new ComboBox();
Controls.Add(comboBox);
comboBox.DataSource = new List<string> { "A", "b", "B", "C" };
comboBox.DropDown += new EventHandler((o, e) => { comboBox.SelectedIndex = 2; });
}
Таким образом, когда мы устанавливаем SelectedIndex = 2 на раскрывающемся меню, пункт "B" должен быть выбран. Но мне странно, что выбран пункт «b» (с индексом = 1)! Мы можем отправить CB_SETCURCELL сообщение напрямую, ничего не изменилось:
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
private void ReproduceBehaviour()
{
ComboBox comboBox = new ComboBox();
Controls.Add(comboBox);
comboBox.DataSource = new List<string> { "A", "b", "B", "C" };
comboBox.DropDown += new EventHandler((o, e) => { SendMessage(comboBox.Handle, 0x14e, 2, 0); });
}
Является ли эта функция (o_O?!), Или что я делаю не так? Спасибо за ответы.
UPD. Как советовал, я попытался установить выделение в listbox вручную на выпадающем списке событий. Никакого эффекта :(
private void ReproduceBehaviour()
{
ComboBox comboBox = new ComboBox();
Controls.Add(comboBox);
comboBox.DataSource = new List<string> { "A", "b", "B", "C" };
comboBox.DropDown += new EventHandler((o, e) =>
{
SendMessage(comboBox.Handle, 0x14e, 2, 0); // CB_SETCURSEL
ComboBoxInfo pcbi = new ComboBoxInfo();
pcbi.cbSize = Marshal.SizeOf(pcbi);
GetComboBoxInfo(comboBox.Handle, ref pcbi);
IntPtr result = SendMessage(pcbi.hwndList, 0x0186, 2, 0); // LB_SETCURSEL
});
}
Я не должен использоваться LB_SETCURSEL потому LB_SETSEL вернулся LB_ERR (LB_SELSET доступны только для multiselectional ListBoxes но в ComboBox singleselectional ListBox используется). вызова метода
IntPtr result = SendMessage(pcbi.hwndList, 0x0186, 2, 0); // LB_SETCURSEL
возвращает значение «2 ', поэтому я предполагаю, что выбор был успешно установлен. Но когда раскрывающийся список полностью открыт, он выбирает неправильное значение, как обычно :( Возможно, событие DropDown не подходит для этого? Я смущен.
Это не проблема Windows 7, XP демонстрирует то же поведение. – NascarEd