如何确定列标题是否在Datagridview
?
由于Datagridview
控件在禁用时不会处于禁用状态,因此我尝试通过在左上角绘制一个小锁图标来模拟它。因为如果在列标题上绘制这看起来很糟糕,我想将它移到它们下面。
但我发现ColumnHeadersVisible
和ColumnHeadersHeight
属性都不能在所有情况下都给出准确的值。有时它们最初会这样做,但是在添加和删除数据之后,属性再次出错。
通过将以下类添加到新项目,运行项目一次并将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
以下是未经进一步修改的结果:
正如您所看到的,即使标题明显不可见(实际上实际上没有任何列),矩形也会在错误的位置绘制。
编辑:我可能不太清楚:每当列标题不可见时,我希望矩形显示在左上角,而顶部没有额外的空格。当列标题可见时,我希望矩形显示在标题单元格下方(意味着从顶部开始以ColumnHeadersHeight
像素距离绘制)。
如何解决这个问题并查找列标题是否真的可见?
无论您喜欢哪种VB.NET或C#中的答案都非常感谢。
答案 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