2015-07-20 63 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