2016-09-27 36 views
1

我使用的是vb.net,並且我有數據進入我的DGV,並且我有一個標記爲已部署的列,如果它是'1',我希望將所有行部署列RED中的'1',如果它是'0',我希望所有行都是綠色的。這是我的方法,現在列是第10列,但它不喜歡=運算符。即使當我使用等於運算符的字符串1上的引號時。應該是一個整數,但我想盡一切辦法,看看爲什麼它不工作。基於列值使DataGridView行變爲特定顏色

Private Sub LaptopGrid_CellFormatting(ByVal Sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles LaptopGrid.CellFormatting 
    For i As Integer = 0 To LaptopGrid.Rows.Count - 1 
     If LaptopGrid.Rows(i).Cells(9).Value = 1 Then 
      LaptopGrid.RowsDefaultCellStyle.BackColor = Color.Green 
     End If 
    Next 
End Sub 

回答

4

您的代碼有幾個問題。

首先,您正在處理CellFormatting事件,但您正在迭代每一行以設置背景顏色。該事件僅供您參考單個特定單元格,所涉及的單元格在事件參數中指示:e.RowIndexe.ColumnIndex。使用一個循環,你需要的行數多於需要的數量,並且一遍又一遍地重複。

二,VB有數據類型。 Int32是一種類型,String是另一種類型,而Object是另一種類型。在比較之前,您需要將一種類型轉換爲另一種類型。 LaptopGrid.Rows(r).Cells(c).Value返回Object(因爲單元格可以保存任何東西),所以要與1進行比較,您需要將其轉換爲整數。

最後,您可能不希望CellFormatting事件。如果有問題的單元格不在屏幕上,則該事件不會觸發(可能是用戶調整了列的大小)。另一方面,當行滾動進入視圖時,另一方面會觸發另一個行。

Private Sub dgv1_RowPrePaint(sender As Object, 
        e As DataGridViewRowPrePaintEventArgs) Handles dgv1.RowPrePaint 

    ' dont do the NewRow 
    If e.RowIndex < 0 OrElse dgv1.Rows(e.RowIndex).IsNewRow Then Return 

    ' convert to int32, then compare 
    ' act on just this row - e.RowIndex 
    If Convert.ToInt32(dgv1.Rows(e.RowIndex).Cells(3).Value) > 3 Then 
     dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LemonChiffon 
    Else 
     dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.MistyRose 
    End If 

End Sub 

enter image description here

如果用戶可以編輯該單元格的值,你將要更新相應的背景色。