2015-07-20 38 views
3

如何查看列标题是否在Datagridview中可见?DataGridView:查看ColumnHeaders是否真的可见

由于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#,无论你喜欢,我们非常感激。

+0

您是否尝试过检查的Columns.Count? – TaW

+0

@TaW这实际上是一个很好的解决方法,我没有想过,我认为它的工作原理。所以'ColumnHeadersVisible'似乎没有考虑到这一点。不会的WinForms没有摆弄;-) – Jens

+0

我认为你应该通过在DataGridView中定义一个锁的PictureBox和控制它的Visible属性改变你的方法。 – Graffito

回答

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 
+0

感谢您的意见。我认为这可能相当于检查'ColumnCount'和'RowCount'。问题是DGV中没有数据和列时会出现什么情况。它可能会正确地返回标题单元格,但这需要进行测试,我猜。 – Jens