2010-07-01 4 views
3

Недавно я воспроизвел странное поведение этого сообщения в моей 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 не подходит для этого? Я смущен.

+0

Это не проблема Windows 7, XP демонстрирует то же поведение. – NascarEd

ответ

2

Это не работает так, как вы думаете. Назначив свойство SelectedIndex, вы не выбираете элемент раскрывающегося списка, вы устанавливаете текст в текстовом поле в поле со списком. Выпадающий список отвечает на это, выбирая элемент списка, соответствующий тексту текстового поля. Проблема в том, что она делает это без учета регистра.

Вы можете легко это увидеть, установив второй предмет, скажем, «D». Это исправляет это. Или установите первый элемент в «b», теперь выбирается первый элемент.

Нет, для этого нет простого решения. Трудным является получение дескриптора элемента управления списком в выпадающем событии с CB_GETCOMBOBOXINFO, а затем отправка его сообщением LB_SETSEL. Прагматическое исправление заключается в том, что элементы списка не отличаются друг от друга. В любом случае, это путает пользователя.

+0

Настройка выбора списка непосредственно не работает в обработчике событий DropDown. Я обновил текст вопроса с новыми результатами. – albicelestial

+0

Вы забыли удалить CB_SETCURSEL –

+0

Если я удалю его, эффект тоже не будет ... – albicelestial

Смежные вопросы