Как настроить всплывающие подсказки для элементов комбинированного списка @ VB.NET? - PullRequest
1 голос
/ 15 июля 2009

У меня есть выпадающий список с заданной шириной. Может случиться, что одна строка данных частично скрыта (поле со списком может быть слишком узким). Я хотел бы показать всю строку с помощью всплывающей подсказки или контекстного меню, вызываемого правой кнопкой мыши.

В настоящее время я не могу найти, как «поймать» строку, которую я в данный момент держу или пропускаю мышью. Пожалуйста, скажите мне.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

Вы пытались увеличить свойство 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 ...

1 голос
/ 19 августа 2009

Идя в том же направлении, что и Жюльен, вот общий метод расширения, который изменяет размер выпадающей области независимо от того, как заполнен комбинированный список (вручную со строками или через привязку данных).

<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

Обратите внимание, в этом примере кода я не тестировал угловые случаи, например пустой комбинированный список.

0 голосов
/ 15 июля 2009

Вы правы, на самом деле "Item.OnMouseOver" не существует, но я полагаю, вы могли бы (не в моей голове, так что я, вероятно, что-то забыл) ...

  • наследуется от ComboBox,
  • переопределить OnDrawItem (вам может потребоваться повернуть change .DrawMode на «Owner Drawn»).
    • вы будете знать, какой элемент находится в событии / переопределении OnDrawItem из EventArgs.
  • Установите всплывающую подсказку на элементе управления в этой точке.
  • опционально установите таймер, чтобы вручную показывать всплывающую подсказку, если вышеуказанное не работает автоматически.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...