投稿者 魔界の仮面弁士  (社会人) 投稿日時 2024/1/29 18:19:47
> Long型 や Date型 に
ということは、Visual Basic での開発ですね。

DataGridView の DataSource を設定して使っていますか?(データバインド)
それとも、セル一つ一つに直接値をセットしていますか?(非バインド)

> セルに値を入力したあと
DataSet などをバインドしている場合は、DataTable の列で型を明示できます。
(個人的にはデータバインドで利用することをお奨めします)

そして画面から値を入力した場合は、基本的に『文字列』としての入力になりますので、
非バインドの場合は入力値をそのまま利用するのではなく、TryParse メソッドを併用するなどして、
入力された値を、「文字列型の 12345」を「整数型の 12345」に変更するとか
「文字列型の 2024/01/29」を「日付型の 2024/01/29」に変更するなどといった、
データ型の検査と変換処置が必要になります。

もちろん、ユーザーが編集した値だけでなく、プログラムでセットした値についても同じことが言えます。
新規フォームに、空の DataGridView を貼って、そのまま実行してみましょう。

'非バインドの場合 
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.DataGridView1.ColumnCount = 1
        Me.DataGridView1.RowCount = 4

        Me.DataGridView1(0, 0).Value = 12L  'これらは Long 型(System.Int64 構造体) 
        Me.DataGridView1(0, 1).Value = 12345L
        Me.DataGridView1(0, 2).Value = "12345"  'ここだけ、文字列型(System.String クラス)が混入している 
        Me.DataGridView1(0, 3).Value = 123L

        ' 見た目では区別がつきませんが、 
        ' 実際のデータ型では Long / String の差異があることがわかります。 
        ' MsgBox(TypeName(Me.DataGridView1(0, 1).Value)) 
        ' MsgBox(TypeName(Me.DataGridView1(0, 2).Value)) 

    End Sub
End Class


'DataTableをバインドした場合 
Public Class Form1
    Private ds As New DataSet()
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tbl = ds.Tables.Add("tbl")
        tbl.Columns.Add("Num"GetType(Long))

        tbl.Rows.Add(12L)
        tbl.Rows.Add(12345L)
        tbl.Rows.Add("12345")  '本来は Long 型を渡すべきだが、あえて文字列側をセット 
        tbl.Rows.Add(123L)

        ds.AcceptChanges()

        Me.DataGridView1.DataSource = ds
        Me.DataGridView1.DataMember = tbl.TableName


        'この DataTable の Num 列は、予め Long 型である事を明示しているため、 
        '文字列が渡されても、自動的に Long 型に変換されて登録されています。 
        ' MsgBox(TypeName(tbl.Rows(2)(0))) 
        ' MsgBox(TypeName(Me.DataGridView1(0, 2).Value)) 
    End Sub
End Class