Как узнать, видны ли заголовки столбцов в 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#, в зависимости от того, что вы предпочитаете, очень ценятся.
ColumnHeadersVisible
, похоже, не принимает это во внимание. Не было бы WinForms без возни ;-) - person Jens   schedule 20.07.2015