Настройка всплывающей подсказки для DataGridView автоматически создаваемых столбцов

Я хотел бы программно установить всплывающие подсказки для автоматически сгенерированных столбцов в DataGridView, Я пытался использовать AutoGeneratingColumn событие ( http://msdn.microsoft.com/en-us/library/cc903950%28VS.95%29.aspx), но на самом деле доступ может только DataGridColumnне DataGridViewColumnи первый не имеет ToolTipText имущество.

Или если бы я мог связать всплывающие подсказки с источником, который также был бы великолепен. Цель состоит в том, чтобы иметь возможность манипулировать / устанавливать всплывающие подсказки в том же месте, где я устанавливаю столбцы для основного DataTable,

3 ответа

Решение

Мне удалось решить это так:

void payloadDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    string tooltip = null;

    switch (e.Column.Header.ToString())
    {
        case "Column 1":
            tooltip = "Tooltip 1";
            break;
        case "Column 2":
            tooltip = "Tooltip 2";
            break;
    }

    if (tooltip != null)
    {
        var style = new Style(typeof(DataGridCell));
        style.Setters.Add(new Setter(ToolTipService.ToolTipProperty, tooltip));
        e.Column.CellStyle = style;
    }
}

Если вы не хотите предполагать какие-либо типы и хотите полагаться на отражение для извлечения атрибута из объекта домена для использования в качестве всплывающей подсказки, вы можете сделать это следующим образом:

      internal class SomeDomainObject
{
    [Description("Some tooltip text")]
    public string SomeProperty { get; set; } = string.Empty;
}

И мы можем использовать перечислитель ItemsSource, чтобы получить первый элемент сетки, который, в свою очередь, даст нам тип объекта домена для размышлений. Здесь я также устанавливаю имя свойства в качестве всплывающей подсказки по умолчанию, используя оператор объединения null. (Приведение к DataGrid должно быть безопасным, поскольку мы знаем, что работаем с DataGrid).

      private void SomeGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var enumerator = ((DataGrid)sender).ItemsSource.GetEnumerator();
    enumerator.MoveNext();
    var itemType = enumerator.Current.GetType();    
    var propInfo = itemType.GetProperty(e.PropertyName);
    var toolTip = propInfo?.GetCustomAttributes<DescriptionAttribute>()
        ?.ElementAtOrDefault(0)?.Description ?? e.PropertyName;

Однако перечисление, вероятно, не является полностью нулевым, и ему нужен хотя бы один объект в вашем списке (или, скорее, в вашей ObservableCollection) объектов домена. Если вы уверены в том, какой тип доменного объекта у вас есть в качестве источника для сетки, вы можете просто сделать это вместо этого. Должно быть быстрее и безопаснее.

      private void SomeGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    var propInfo = typeof(SomeDomainObject).GetProperty(e.PropertyName);
    var toolTip = propInfo?.GetCustomAttributes<DescriptionAttribute>()
        ?.ElementAtOrDefault(0)?.Description ?? e.PropertyName;

И, наконец, чтобы установить всплывающую подсказку в заголовке (все еще в методе события SomeGrid_AutoGeneratingColumn):

      var headerStyle = new Style(typeof(DataGridColumnHeader));
headerStyle.Setters.Add(new Setter(ToolTipService.ToolTipProperty, toolTip));
e.Column.HeaderStyle = headerStyle;

tooltiptext для конкретной ячейки:

DataGridView1.Rows[3].Cells["colnameX"].ToolTipText = " hover and see me";

добавление всплывающей подсказки к динамически добавляемой строке определенной ячейки

private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int index = e.RowIndex; index <= e.RowIndex + e.RowCount - 1; index++)                           
    {
        DataGridViewRow row = DataGridView1.Rows[index];
        row.Cells["colnameX"].ToolTipText = " hover and see me";

    }
}
Другие вопросы по тегам