我有一个给定宽度的组合框。 可能会发生一行数据被部分隐藏(组合框可能太窄)。我想通过使用工具提示或右键单击上下文菜单来显示整行。
目前我找不到如何“抓住”我目前持有或通过鼠标移过的行。请告诉我。
提前致谢!
答案 0 :(得分:2)
您是否尝试过增加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
的{{1}}事件中进行测试。也许你可以找到一个更好的地方,比如填充ComboBox
...
答案 1 :(得分:1)
与Julien去的方向相同,这里是一个通用的扩展方法,无论组合框是如何填充的,都会调整下拉区域的大小(手动使用字符串或通过数据绑定)。
<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
注意,在本代码示例中,我没有像空组合框那样测试角落情况。
答案 2 :(得分:0)
你是对的,确实没有“Item.OnMouseOver”,但我想你可以(在我头顶,所以我可能忘记了什么)......