Nano Hash - криптовалюты, майнинг, программирование

vb.net показывает всплывающую подсказку для каждого элемента в datagridviewcombobox

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

'assuming dtExpense is the datatable used as datasource
With CType(DataGridView3.Columns(2), DataGridViewComboBoxColumn)
    .AutoComplete = True
    .DataSource = dtExpense
    .DisplayMember = "acct_title"
    .ValueMember = "acct_id"
    .DataPropertyName = "acct_id"
    .ToolTipText = "description"
End With

Может ли кто-нибудь сказать мне, как это сделать. В datagriviewcell.tooltiptext он должен быть нарисован в какой-то момент. Я думал, как это сделать с помощью datagridviewcomboboxcolumn, и он должен отображаться для каждого элемента в поле со списком.


Ответы:


1

Предполагая, что у вас есть класс объектов со свойствами string с именами acct_title (для отображения в виде раскрывающихся элементов) и description (для отображения в виде всплывающих подсказок в этих раскрывающихся элементах), вам потребуется:

  1. Добавьте в форму элемент управления ToolTip.
  2. Обработайте событие EditingControlShowing для DataGridView, чтобы добавить обработчики событий в базовый ComboBox.

    Me.DataGridView3.EditingControlShowing += DataGridView3_EditingControlShowing
    
    Private Sub DataGridView3_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs)
    If TypeOf e.Control Is ComboBox Then
            Dim cb As ComboBox = TryCast(e.Control, ComboBox)
            cb.DrawMode = DrawMode.OwnerDrawFixed
            cb.DrawItem -= Cb_DrawItem
            cb.DrawItem += Cb_DrawItem
            cb.DropDownClosed -= Cb_DropDownClosed
            cb.DropDownClosed += Cb_DropDownClosed
        End If
    End Sub
    
  3. Обработайте событие ComboBox DrawItem, чтобы установить значение всплывающей подсказки и отобразить его. Мы будем использовать отражение, чтобы получить свойство description из раскрывающихся элементов и установить его строковое значение в всплывающую подсказку.

    Private Sub Cb_DrawItem(sender As Object, e As DrawItemEventArgs)
        Dim cb As ComboBox = TryCast(sender, ComboBox)
        Dim item = cb.Items(e.Index)
        Dim display As String = cb.GetItemText(item)
        Dim toolText As String = item.[GetType]().GetProperty("description").GetValue(item, Nothing).ToString()
    
        e.DrawBackground()
    
        Using br As New SolidBrush(e.ForeColor)
            e.Graphics.DrawString(display, e.Font, br, e.Bounds)
        End Using
    
        If (e.State And DrawItemState.Focus) = DrawItemState.Focus AndAlso cb.DroppedDown Then 
            Me.toolTip1.Show(toolText, cb, e.Bounds.Right, e.Bounds.Bottom, 2000)
        End If
    
        e.DrawFocusRectangle()
    End Sub
    
  4. Обработайте событие ComboBox DropDownClosed, чтобы скрыть всплывающую подсказку.

    Private Sub Cb_DropDownClosed(sender As Object, e As EventArgs)
        Dim cb As ComboBox = TryCast(sender, ComboBox)
        Me.toolTip1.Hide(cb)
    End Sub
    
28.01.2016
  • Спасибо за ваш ответ! Мне нужно было изменить некоторые строки кода, так как в моем представлении данных есть много других выпадающих списков. Я думаю, что все в порядке. Но я получаю NullReferenceException вокруг этой строки Dim toolText As String = item.[GetType]().GetProperty("description").GetValue(item, Nothing).ToString(), я даже проверяю, есть ли cb isNot Nothing (хотя я думаю, что это не обязательно, поскольку всплывающая подсказка должна показывать, когда элемент зависает, а не когда он выбран), но эта ошибка все еще сохраняется. Как вы думаете, мне нужно добавить тип данных здесь Dim item = cb.Items(e.Index)? 29.01.2016
  • Единственный способ воспроизвести эту ошибку, если бы я сделал .GetProperty("PropertyThatIsNotOnTheObject"). Вы можете попробовать поместить тип данных в Dim item, но если я прав, это просто вызовет ту же ошибку. Убедитесь, что GetProperty вызывается со строкой, которая является именем свойства, которое вы хотите отобразить во всплывающей подсказке. 29.01.2016
  • Я установил .ToolTipText = "description" в своем свойстве datagridviewcomboboxcolumn. Это должно быть хорошо, верно? Но я не могу понять, почему я все еще получаю NullReference. Итак, я нашел обходной путь и как бы ищу description из самого Datasource. Я очень неэффективен здесь, но это сработало. Спасибо за помощь!! Но есть небольшая проблема, вы все еще можете мне помочь? Подсказка отображается в самом низу экрана, так как у меня очень длинный список названий учетных записей. Как я могу заставить его отображаться рядом с элементом списка? 30.01.2016
  • Что ж, я исследовал, почему это произошло, я думаю, это потому, что раскрывающийся список перемещается вверх, если под самим полем со списком недостаточно места. И пока это происходит, e.Bounds.Bottom по-прежнему считает, что первый элемент все еще отображается чуть ниже поля со списком. Что я сделал, так это просто вычел из него некоторую величину, чтобы исправить его координату Y. Я просто не уверен, что это будет работать при разных разрешениях экрана, поскольку оно недостаточно динамично, чтобы настроить себя. 30.01.2016
  • Извините, что расположение всплывающей подсказки огорчило вас. В моих тестах он отображался выровненным и справа от всплывающего элемента, но я рад слышать, что вы нашли обходной путь. Извините за медленный ответ; Я переехал на выходных. 01.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..