2016-09-27 2 views
1

vb.net을 사용하고 있고 데이터가 내 DGV에 들어 있으며 '1'이면 배포 된 열로 표시되어 있고 모든 행을 갖고 싶습니다. '1'은 배포 된 열 RED에서 '0'이면 모든 행을 녹색으로 만듭니다. 이것은 제 방법입니다, 지금은 열이 열 10이지만 = 연산자가 맘에 들지 않습니다. 1에 대해 따옴표를 사용할 때도 문자열에 대해 equals 비교 연산자를 사용할 수 있습니다. 정수가되어야하지만 왜 작동하지 않는지를 볼 수있는 모든 방법을 시도하고있었습니다.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.RowIndexe.ColumnIndex 이벤트에 표시됩니다. 루프를 사용하면 필요 이상으로 많은 행을 반복적으로 수행합니다.

둘째, VB에는 데이터 형식이 있습니다. Int32은 하나의 유형이고 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

사용자가 해당 셀의 값을 편집 할 수 있다면, 당신은 그에 따라 다시 색을 업데이트 할 것입니다.

관련 문제