2

バインドされたデータグリッドビューの従業員 ID 列を使用して、別のデータテーブルで「従業員 ID」を検索し、バインドされていない「名前」列で従業員名を返すために、cellformatting を使用しています。

  Private Sub PartePersonalDataGridView_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    If DataGridView1.RowCount > 0 AndAlso e.RowIndex > -1 Then
        Dim dgvr As DataGridViewRow = DataGridView1.Rows(e.RowIndex)
        Dim empID As Integer = CInt(dgvr.Cells(0).Value)
        Dim qry = From dr As PersonalObraDataSet.PersonalObRow In _PersonalObraDataSet.PersonalOb _
                  Where dr.cdTrabajador = empID
        If qry.Count > 0 Then
            DataGridView1.Rows(e.RowIndex).Cells(1).Value = qry.First.Nombre1
            'DataGridView1.Rows(e.RowIndex).Cells(5).Value = qry.First.Nombre2
        End If
    End If
End Sub

すべてが正常にロードされ、各 ID に必要な名前が正常にロードされますが、新しい行が追加されると、新しい従業員 ID を入力する前に cellformatting イベントが発生し、DBNull エラーが発生します。見て空です。

しばらく探しましたが、セルの編集が完了した後またはセルを離れた後にセルフォーマットを起動する方法、またはフィールド従業員 ID が空の場合にセルをフォーマットしないようにする方法が見つかりません。

4

1 に答える 1

2

cellFormating イベントがいつ発生するかを「決定」できるとは思いません。しかし、私があなたの問題を理解していれば、cell.value が null かどうかをテストする必要があると思います

cell.value が null の場合、このコード行でエラーが発生します。

Dim empID As Integer = CInt(dgvr.Cells(0).Value)

したがって、次のようなことを行う必要があります。

If dgvr.Cells(0).Value IsNot nothing AndAlso dgvr.Cells(0).Value IsNot DbNull.value Then
   Dim empID As Integer = CInt(dgvr.Cells(0).Value)

   (...)

End If
于 2013-07-19T16:47:57.703 に答える