Я создаю пользовательский combobox, который может рисовать разделители. Поэтому я переопределяю методы OnDrawItem() и OnMeasureItem().
Проблема заключается в том, что OnMeasureItem() вызывается только один раз при изменении источника данных. Поэтому, если я хочу указать элемент разделителя позже, мне нужно изменить его высоту (поскольку элементы с разделителем должны быть выше), но кажется, что все методы, которые могут привести к переоценке высоты элемента, являются частными, поэтому я не могу их назвать ,
Я не знаю, легко ли понять, что я написал выше, поэтому я буду повторять то, что мне нужно:
Мне нужно переоценить высоту элемента (нужно вызывать OnMeasureItem() каждый раз, когда я указываю, что элемент должен быть нарисован с помощью разделителя.Как сделать высоту позиции переименования combobox?
separatorableComboBox.DataSource = customers;
// and now I want the third customer in the list to be drawn with a separator,
// so it needs to be taller and therefore OnMeasureItem() should be called
separatorableComboBox.SpecifySeparatorItem(customers[2]);
UPD. Ребята, вызывая RefreshItems() работает, но это очень медленно (> 20 мс на моей машине), есть ли более быстрые методы?
UPD2. Прямо сейчас я использую SendMessage (..., CB_SETITEMHEIGHT, ...); метод, рекомендованный serge_gubenko. Но мне просто интересно, есть ли быстрый способ выполнить задачу с .NET (или, более конкретно, с самим классом ComboBox)?
Отправка сообщения работает быстро, но мне просто интересно, есть ли более правильный и быстрый способ выполнить задачу с управляемым кодом (более конкретно, возможно, с классом ComboBox)? – nightcoder
Я бы не стал слишком беспокоиться об этом при использовании winforms, в конце концов все еще есть элемент управления COMBOBOX Windows (http://msdn.microsoft.com/en-us/library/bb775792(VS.85).aspx), работающий на ваша форма; вы можете проверить его со шпионом ++. Класс ComboBox делает то же самое при настройке высоты элемента в методе UpdateItemHeight(), который является приватным, поэтому вам нужно использовать отражение, чтобы вызвать его. Что касается RefreshItems, он полностью перезагружает список элементов. В принципе, он должен быть таким же, чтобы установить значение null в его свойство DataSource, а затем восстановить его обратно до предыдущего значения –