投稿者 魔界の仮面弁士  (社会人) 投稿日時 2024/1/30 12:42:41
> そして画面から値を入力した場合は、基本的に『文字列』としての入力になりますので、
> 非バインドの場合は入力値をそのまま利用するのではなく、TryParse メソッドを併用するなどして、
> 入力された値を、「文字列型の 12345」を「整数型の 12345」に変更するとか
> 「文字列型の 2024/01/29」を「日付型の 2024/01/29」に変更するなどといった、
> データ型の検査と変換処置が必要になります。

下記は非バインド状態の時に、0 列目に Long 値の入力を強制させる例です。
入力値は文字列型で入ってくるので、数値に変換なら Long.TryParse メソッドで変換します。
日付型の列ならば、Date.TryParseExact を使うなどしてみてください。

Private Sub DataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
    ''0列目は Long 値を必須とする。Long 値にできない文字列が入力されたら拒絶。 
    'If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 Then 
    '    Dim n As Long = 0 
    '    If Not Long.TryParse(e.FormattedValue, n) Then 
    '        e.Cancel = Me.DataGridView1.NewRowIndex <> e.RowIndex 
    '    End If 
    'End If 
End Sub

Private Sub DataGridView1_CellValidated(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValidated
    '0列目の値が Long 型でなかった場合は、Long 値に変換する。 
    If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 Then
        Dim v = Me.DataGridView1(0, e.RowIndex).Value
        If TypeOf v IsNot Long Then
            Dim n As Long = 0
            If Long.TryParse(v?.ToString(), n) Then
                Me.DataGridView1(0, e.RowIndex).Value = n
            Else
                'Me.DataGridView1(0, e.RowIndex).Value = DBNull.Value 
            End If
        End If
    End If
End Sub


ただし、CellValidating/CellValidated イベントが効くのは、ユーザー操作に対してです。
プログラムから直接、
 Me.DataGridView1.BeginEdit(True)
 Me.DataGridView1(0, 0).Value = "1234"  'Long 値では無いがセットできてしまう
 Me.DataGridView1.EndEdit()
などと値をセットした場合には、これらのイベントが呼び出されません。

プログラムからの直接入力の際には、値をセットする段階で検査し、
必要に応じて「正しいデータ型」の値に変換してから代入するようにします。