DataGridView: найдите, действительно ли видны заголовки столбцов

Как узнать, видны ли заголовки столбцов в Datagridview?

Поскольку элемент управления Datagridview не отображается в отключенном состоянии, когда он отключен, я пытаюсь эмулировать это, рисуя маленький значок замка в верхнем левом углу. Поскольку это выглядит плохо, если рисовать поверх заголовков столбцов, я хочу переместить его под них.

Однако я обнаружил, что ни свойства ColumnHeadersVisible, ни свойства ColumnHeadersHeight не дают точных значений во всех случаях. Иногда они делают сначала, но после того, как данные добавлены и удалены, например, свойство снова неверно.

Это можно легко воспроизвести, добавив следующий класс в новый проект, запустив проект один раз и добавив в форму элемент управления NewDGV. Даже в Дизайнере видно, что прямоугольник нарисован не в том месте.

Public Class NewDGV
    Inherits DataGridView

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)
        
        Dim y As Integer = 0
        'Get the location to draw a rectangle to
        If Me.ColumnHeadersVisible Then
            'y = Me.ColumnHeadersHeight + 1 gives the wrong value as well
            y = Me.GetCellDisplayRectangle(-1, -1, False).Height + 1
        Else
            y = 1
        End If
        e.Graphics.FillRectangle(Brushes.Azure, 1, y, 30, 30)
    End Sub
End Class

Вот результат без дальнейших изменений:

введите здесь описание изображения

Как видите, несмотря на то, что заголовки явно невидимы (на самом деле там и так нет столбцов), прямоугольник рисуется не в том месте.

Редактировать: Возможно, я не совсем ясно выразился: когда заголовки столбцов невидимы, я хочу, чтобы прямоугольник появлялся в верхнем левом углу без дополнительного пространства вверху. Когда заголовки столбцов видны, я хочу, чтобы прямоугольник отображался под ячейками заголовков (то есть рисуется на расстоянии ColumnHeadersHeight пикселей от вершины).

Как я могу это исправить и узнать, действительно ли видны заголовки столбцов?

Ответы как на VB.NET, так и на C#, в зависимости от того, что вы предпочитаете, очень ценятся.


person Jens    schedule 20.07.2015    source источник
comment
Вы пытались проверить Columns.Count?   -  person TaW    schedule 20.07.2015
comment
@TaW На самом деле это хороший обходной путь, о котором я не думал, и я думаю, что он работает. Таким образом, ColumnHeadersVisible, похоже, не принимает это во внимание. Не было бы WinForms без возни ;-)   -  person Jens    schedule 20.07.2015
comment
Я думаю, что вы должны изменить свой подход, определив Lock PictureBox поверх DataGridView и управляя его свойством Visible.   -  person Graffito    schedule 21.07.2015
comment
Боюсь, это не имеет ничего общего с вопросом @Graffito.   -  person Jens    schedule 21.07.2015


Ответы (1)


Не уверен, что это работает при любых обстоятельствах — проверьте свойство FirstDisplayedCell:

  Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    Dim y As Integer = 0
    'Get the location to draw a rectangle to'
    If Me.ColumnHeadersVisible And Me.FirstDisplayedCell IsNot Nothing Then
      '                        ---------------------------------------
      ' 
      y = Me.GetCellDisplayRectangle(-1, -1, False).Height + 1
    Else
      y = 1
    End If
    e.Graphics.FillRectangle(Brushes.Azure, 1, y, 30, 30)
  End Sub
person SSS    schedule 21.07.2015
comment
Спасибо за ваш вклад. Я думаю, что это может быть эквивалентно проверке ColumnCount и RowCount. Вопрос в том, что происходит, когда в DGV нет данных, а только столбцы. Вероятно, он правильно вернет ячейку заголовка, но, думаю, это нужно проверить. - person Jens; 21.07.2015