0

DataGridView コントロールにデータを入力するときに、「セルの書式設定された値の型が間違っています」というエラーがランダムに表示されるというアプリケーションの問題があります。

このコントロールは、データベースから行のリストを作成するデータテーブルにバインドされています。セルデータをチェックし、それに応じて変更するセルフォーマットを設定しています。たとえば、cell.value = 'x' の場合、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 コントロールをロードするたびにエラーが発生することが予想されます。

どんな助けでも感謝します。

4

1 に答える 1

0

さて、私のコードをいじってみると、問題の原因は見つかったと思いますが、答えはわかりません。

問題は、SQL クエリが結果を返さない (または十分な速さで結果を返すことができない) 場合だと思います。コードは Cell_Formatting イベントに入りますが、データがないためにエラーが発生します。

Private Sub dgvRegisters_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) dgvRegisters.CellFormatting を処理します e.RowIndex < 0 の場合は、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) 'Code falls over here with Object reference not set to an instance of an object

データセットがゼロ レコードを返す場合にコードが書式設定イベントに入らないようにする方法がわかりません。または、書式設定するレコードがない場合は、書式設定をスキップすることをお勧めします。

于 2013-08-28T07:16:00.767 に答える