如何设置工具提示到组合框项目@ VB.NET?

时间:2009-07-15 14:13:21

标签: vb.net winforms combobox

我有一个给定宽度的组合框。 可能会发生一行数据被部分隐藏(组合框可能太窄)。我想通过使用工具提示或右键单击上下文菜单来显示整行。

目前我找不到如何“抓住”我目前持有或通过鼠标移过的行。请告诉我。

提前致谢!

3 个答案:

答案 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”,但我想你可以(在我头顶,所以我可能忘记了什么)......

  • 继承自ComboBox,
  • 覆盖OnDrawItem(您可能需要将更改.DrawMode更改为“所有者绘制”)。
    • 您将知道在EventArgs的OnDrawItem事件/覆盖中悬停了哪个项目。
  • 此时在控件上设置工具提示。
  • 如果以上操作不能自动运行,可以选择设置计时器以手动显示工具提示。