2013-08-22 3 views
0

내 DataGridView 컨트롤을 채울 때 "셀의 서식이 지정된 값이 잘못되었습니다."라는 오류가 발생하는 응용 프로그램에 문제가 있습니다.DatagridView 무작위로 서식 오류 가져 오기

이 컨트롤은 데이터베이스에서 행 목록을 만드는 데이터 테이블에 바인딩됩니다. 셀 데이터를 확인하고 이에 따라 셀 서식을 지정합니다. 예를 들어, cell.value = 'x'then cell.value = y 등. 이것은 약 99 %의 시간 동안 정상적으로 작동하지만, 지금은 위의 오류가 발생합니다. 오류를 지우고 새로 고치면 DataGridView 컨트롤이 잘 채 웁니다.

어쨌든이 오류의 원인을 정확하게 추적 할 수 있습니까? 내 코드는 ... 그래서처럼 보이는

Private Sub dgvRegisters_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvRegisters.CellFormatting 

Try 
    If e.RowIndex < 0 Then Exit Sub 

    If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_Online") Then 
     e.FormattingApplied = True 

     Select Case Convert.ToInt32(dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) 
      Case 1 
       e.Value = ilstVNC.Images(0) 
      Case Else 
       e.Value = ilstVNC.Images(1) 
     End Select 
     If XMLLoggingType = "Debug (All Activity)" Then CreateLog("Formatting DatagridView('Registers') " & dgvRegisters.Columns(e.ColumnIndex).Name & "(" & e.RowIndex + 1 & ")") 
    End If 

    If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_OS") Then 
     e.FormattingApplied = True 

     Select Case (dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value).ToString 
      Case "Microsoft Windows XP Professional" 
       e.Value = "Win XP" 
      Case Else 
       e.Value = "" 
     End Select 
     If XMLLoggingType = "Debug (All Activity)" Then CreateLog("Formatting DatagridView('Registers') " & dgvRegisters.Columns(e.ColumnIndex).Name & "(" & e.RowIndex + 1 & ")") 
    End If 

    If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_TimeZone") Then 
     e.FormattingApplied = True 

     Select Case (dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value).ToString 
      Case "(GMT+09:30) Adelaide" 
       e.Value = "Adelaide" 
      Case "(GMT+10:00) Brisbane" 
       e.Value = "Brisbane" 
      Case "N/A" 
       e.Value = "" 
      Case Else 
       e.Value = "" 
     End Select 
     If XMLLoggingType = "Debug (All Activity)" Then CreateLog("Formatting DatagridView('Registers') " & dgvRegisters.Columns(e.ColumnIndex).Name & "(" & e.RowIndex + 1 & ")") 
    End If 

    If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_ComputerType") Then 
     e.FormattingApplied = True 

     Select Case (dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value).ToString 
      Case "AWRDACPI" 
       e.Value = "A-Box 122" 
      Case "HP Compaq dx7400 SFF", "HP Compaq dx7400 Small Form Factor.", "HP Compaq dx7400 Microtower" 
       e.Value = "HP DX7400" 
      Case "GHD385AV" 
       e.Value = "HP GHD385" 
      Case "To Be Filled By O.E.M." 
       e.Value = "A-Box 120" 
      Case Else 
       e.Value = "Unknown" 
     End Select 
     If XMLLoggingType = "Debug (All Activity)" Then CreateLog("Formatting DatagridView('Registers') " & dgvRegisters.Columns(e.ColumnIndex).Name & "(" & e.RowIndex + 1 & ")") 
    End If 

    If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_p_pos") Or (dgvRegisters.Columns(e.ColumnIndex).Name = "r_p_updprg") Or (dgvRegisters.Columns(e.ColumnIndex).Name = "r_p_communic") Or (dgvRegisters.Columns(e.ColumnIndex).Name = "r_p_eftclt") Or (dgvRegisters.Columns(e.ColumnIndex).Name = "r_p_eftsvr") Then 
     e.FormattingApplied = True 

     Select Case Convert.ToInt32(dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) 
      Case 1 
       e.Value = ilstStatus.Images(0) 
      Case Else 
       e.Value = ilstStatus.Images(1) 
     End Select 
     If XMLLoggingType = "Debug (All Activity)" Then CreateLog("Formatting DatagridView('Registers') " & dgvRegisters.Columns(e.ColumnIndex).Name & "(" & e.RowIndex + 1 & ")") 
    End If 

Catch ex As Exception 
    If (XMLLogErrors = True And XMLLoggingType = "Custom") Or XMLLoggingType = "Debug (All Activity)" Then CreateLog(ex.Message) 
    If MySQLConn.State = ConnectionState.Open Then MySQLConn.Close() 

End Try 
End Sub 

는 기본적으로이 코드는 단지를 통해 실행하고 특정 값을 검사 특정 세포를. 나는 합리적으로 VB.NET에 익숙하지 않지만 코드가 잘못 되었다면 DataGridView 컨트롤을로드 할 때마다 오류가 발생할 것으로 예상됩니다.

감사합니다. 감사드립니다.

+0

또한 DataGridView는 첫 번째 행을 채울 때이 서식 오류가 발생하고 나머지 컨트롤을 채우는 전체 루틴을 종료한다는 사실을 잊어 버렸습니다. 따라서 빈 컨트롤로 끝납니다. – Riples

답변

0

내 코드로 놀아보기에 문제의 원인을 찾은 것 같지만 대답이 아니라고 생각합니다.

개인 서브 dgvRegisters_CellFormatting (:

내 SQL 쿼리 결과를 반환하는 데 실패 (또는 충분히 빠른 결과를 반환하지) 때 문제가 생각, 내 코드로 인해 어떤 데이터에 Cell_Formatting 이벤트되었지만 오류로 진입 DataGridViewCellFormattingEventArgs으로 개체 전자로 보낸 사람이) 0 그럼이 경우 형식 이벤트에가는 내 코드를 방지하는 방법을 모른다

If (dgvRegisters.Columns(e.ColumnIndex).Name = "r_Online") Then 
     e.FormattingApplied = True 

     Select Case Convert.ToInt32(dgvRegisters.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) 'Code falls over here with Object reference not set to an instance of an object 

하위 종료 e.RowIndex < 경우 을 시도 dgvRegisters.CellFormatting를 처리 데이터 세트 r 포맷 할 레코드가 없으면 포맷없이 레코드를 없애거나 더 나은 방법으로 건너 뜁니다.