我有一個給定寬度的組合框。 可能會出現一行數據部分隱藏(組合框可能太窄)。我想通過使用工具提示或右鍵單擊上下文菜單來顯示整行。如何在VB.NET中設置工具提示到組合框?
目前我無法找到如何「捕捉」我當前正在使用或通過鼠標傳遞的行。請告訴我。
在此先感謝!
我有一個給定寬度的組合框。 可能會出現一行數據部分隱藏(組合框可能太窄)。我想通過使用工具提示或右鍵單擊上下文菜單來顯示整行。如何在VB.NET中設置工具提示到組合框?
目前我無法找到如何「捕捉」我當前正在使用或通過鼠標傳遞的行。請告訴我。
在此先感謝!
您是否嘗試過增加DropDownWidth
屬性以便一切都可見?
編輯:基於列表中的項目找到了理想的寬度:
var maxLength = 0;
// using the ComboBox to get a Graphics object:
using (var g = Graphics.FromHwnd(comboBox2.Handle)) {
foreach (var item in comboBox2.Items.Cast<string>()) {
var itemLength = g.MeasureString(item, comboBox2.Font);
maxLength = Math.Max((int) itemLength.Width, maxLength);
}
}
if (comboBox2.Items.Count > comboBox2.MaxDropDownItems) {
// correction when ScrollBar is displayed
maxLength += 15;
}
comboBox2.DropDownWidth = maxLength;
我把這個代碼在DropDown
事件ComboBox
進行測試。也許你可以找到一個更好的地方,如填充後ComboBox
...
你是對的,真的不是一個「Item.OnMouseOver」,但我想你可以(關閉我的頂部頭,所以我可能已經忘了什麼)......從組合框
在朱利安去同一個方向走,這裏是一個通用的擴展方法,將調整下拉區域無論組合框的填充方式(手動字符串或通過數據綁定)。
<Extension()> _
Public Sub AutosizeDropDownWidth(ByVal combobox As ComboBox)
Dim longestItem As Integer = 0
Using g = Graphics.FromHwnd(combobox.Handle)
Dim itemsAsText = (From item In combobox.Items _
Select combobox.GetItemText(item))
longestItem = CInt(itemsAsText.Max(Function(text) g.MeasureString(text, combobox.Font).Width))
End Using
' Account for scrollbar
If (combobox.Items.Count > combobox.MaxDropDownItems) Then longestItem += 15
' Resize as needed (but never smaller than the default width)
combobox.DropDownWidth = Math.Max(longestItem, combobox.Width)
End Sub
要使用它,那麼你可以簡單地做下面...
Private Sub MyCombobox_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyCombobox.DropDown
MyCombobox.AutosizeDropDownWidth()
End Sub
注意,我沒有測試角落情況下,像在這個代碼示例一個空的組合框。
謝謝,我不知道這個屬性。現在的問題是如何知道最長數據的寬度。 – 2009-07-15 14:45:32
要測量文本,請查看System.Drawing.Graphics.MeasureString方法。 – hometoast 2009-07-15 14:59:29