2016-09-27 14 views
1

vb.netを使用していて、データがDGVに入っていて、 '1'の場合は展開済みの列があります。展開された列REDに '1'があり、 '0'であればすべての行が緑色になります。これは私の方法ですが、今は列が10番目の列ですが、=演算子が好きではありません。たとえ私が文字列のequals比較演算子で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イベントを処理していますが、すべての行を繰り返してバックカラーを設定しています。このイベントは、という単一の特定のセルに何かを行うことを意味します。問題のイベントは、イベントargs:e.RowIndexおよびe.ColumnIndexに示されます。ループを使用すると、必要以上に多くの行が実行され、繰り返し実行されます。

第2に、VBにはデータ型があります。 Int32は1つのタイプであり、Stringは別のものであり、Objectはさらに別のタイプです。比較する前に、あるタイプを他のタイプに変換する必要があります。 LaptopGrid.Rows(r).Cells(c).ValueObjectを返します(セルには文字通り何も格納できないため)1と比較するには、整数に変換する必要があります。

最後に、このためにCellFormattingイベントが必要ない場合があります。問題のセルが画面に表示されない場合、イベントは発生しません(おそらくユーザーが列のサイズを変更した)。一方、行がスクロールして表示されると、RowPrePaintが発生します。

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

ユーザがそのセルの値を編集することができます場合は、それに応じて背景色を更新することになるでしょう。

関連する問題