我正在創建一個可以繪製分隔符的自定義組合框。所以,我重寫OnDrawItem()和OnMeasureItem()方法。
問題是OnMeasureItem()僅在數據源更改時被調用一次。因此,如果我想稍後指定分隔項目,我需要重新測量它的高度(因爲帶分隔符的項目應該更高),但似乎所有可能導致項目高度被重新測量的方法都是私有的,所以我不能稱它們爲。
我不知道是否很容易理解我上面寫的東西,所以我會重複我需要的東西:
每次我需要重新測量項目高度(必須調用OnMeasureItem())時,我指定項目應該用分隔符繪製。如何使組合框重新測量項目高度?
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 2010-01-20 22:14:48
使用winforms時,我不會擔心它太多,最終還是會有一個windows COMBOBOX控件(http://msdn.microsoft.com/en-us/library/bb775792(VS.85).aspx)運行你的形式;你可以用spy ++來檢查它。 ComboBox類在其UpdateItemHeight()方法中調整項目高度時使用相同的方法,該方法是私有的,因此您需要使用反射來調用它。至於RefreshItems,它完全重新加載項目列表。基本上它應該是相同的,將null設置爲其DataSource屬性,然後將其恢復爲以前的值 – 2010-01-21 01:18:52