DataGridView:查找ColumnHeaders是否真的可见

时间:2015-07-20 17:54:45

标签: c# vb.net winforms datagridview datagridviewcolumn

如何确定列标题是否在Datagridview

中可见

由于Datagridview控件在禁用时不会处于禁用状态,因此我尝试通过在左上角绘制一个小锁图标来模拟它。因为如果在列标题上绘制这看起来很糟糕,我想将它移到它们下面。

但我发现ColumnHeadersVisibleColumnHeadersHeight属性都不能在所有情况下都给出准确的值。有时它们最初会这样做,但是在添加和删除数据之后,属性再次出错。

通过将以下类添加到新项目,运行项目一次并将NewDGV控件添加到表单中,可以轻松地重现这一点。即使在Designer中,您也可以看到矩形是在错误的位置绘制的。

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

以下是未经进一步修改的结果:

enter image description here

正如您所看到的,即使标题明显不可见(实际上实际上没有任何列),矩形也会在错误的位置绘制。

编辑:我可能不太清楚:每当列标题不可见时,我希望矩形显示在左上角,而顶部没有额外的空格。当列标题可见时,我希望矩形显示在标题单元格下方(意味着从顶部开始以ColumnHeadersHeight像素距离绘制)。

如何解决这个问题并查找列标题是否真的可见?

无论您喜欢哪种VB.NET或C#中的答案都非常感谢。

1 个答案:

答案 0 :(得分: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