none
DataGridViewにおけるInt64値のSortってできますか? RRS feed

  • 質問

  • DataGridViewにて[ID] [名前] [売上]といったフィールドを作成し、各々左から、Int32・String・Int64とタイプを指定します。

    アプリケ-ションを実行し、入力作業をします。[売上]については100000000000、26000000000、24500000000とか巨大な数値を入力値とします。

    ある程度、入力し終わったら、ヘッダーをクリックしソートをします。

    [ID][名前]ヘッダーでのソートは問題なく行われるのですが、[売上]ヘッダーをクリックしてソートしようとすると「ArgumentExceptionはハンドルされませんでした。」「オブジェクトは Int64 型でなければなりません。」とエラーとなります。

    DataGridViewにおいてInt32値を超えるソートはできないのでしょうか?

     

    2007年9月16日 8:28

回答

  • ありがとうございました。

    Lを付加したり、Ctypeでキャストすることにより正常にソートされることを確認できました。

    「.ValueType = Type.GetType("System.Int64")」とすることにより、4列目の数値は、

    Int64型とみなされると思っていました。

    2007年9月16日 15:09

すべての返信

  • 再現用のプロジェクトを作ってみましたが、再現させることができませんでした。

     

    以下、私が行った作業です。

    デザイナからColumnTypeにDataGridViewTextBoxColumnを指定した列を3つ追加。

    ↓のコードを追加

     

    Code Snippet
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         DataGridView1.Columns(0).ValueType = Type.GetType("System.Int32")
         DataGridView1.Columns(1).ValueType = Type.GetType("System.String")
         DataGridView1.Columns(2).ValueType = Type.GetType("System.Int64")
    End Sub

     


    これをデバッグ実行し、「売上」に100000000000、26000000000、24500000000を入力。

    「売上」ヘッダーをクリック。

    正しくソートされました。

    再現のやり方が悪いかもしれません。

    違っている点があれば指摘願います。

     

    ※環境

    Windows Vista Home Premium

    Visual Basic 2005 Express Edition

    2007年9月16日 11:28
  • 早速の返信ありがとうございます。下記に具体的なコードを示します。

    レコードの3件目(DataGridView2.Rows.Add(3000, "山田ニ郎", 4, 2147483648))で

    Int32を超えるデータを指定しています。

    DataGridViewのプロパティについては、RowHeaderVisible=Falseぐらいでその他は

    デフォルトです。

    Code Snippet

      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          Dim ExtextColumn As New DataGridViewTextBoxColumn()
          With ExtextColumn
            .DataPropertyName = "ID"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .ValueType = Type.GetType("System.Int32")
            .Name = "ID"
            .HeaderText = "  ID"
            .Width = 80
          End With

          Dim ExtextColumn1 As New DataGridViewTextBoxColumn()
          With ExtextColumn1
            .DataPropertyName = "TNAME"
            .ValueType = Type.GetType("System.String")
            .Name = "TNAME"
            .HeaderText = "     担当者名"
            .Width = 160
          End With

          Dim ExtextColumn2 As New DataGridViewTextBoxColumn()
          With ExtextColumn2
            .DataPropertyName = "PKENSU"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "##,###,##0"
            .ValueType = Type.GetType("System.Int32")
            .Name = "Column2"
            .HeaderText = " 件 数"
            .Width = 50
          End With

          Dim ExtextColumn3 As New DataGridViewTextBoxColumn()
          With ExtextColumn3
            .DataPropertyName = "PKINGAKU"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "##,###,##0"
            .ValueType = Type.GetType("System.Int64")
            .Name = "Column3"
            .HeaderText = "   売   上"
            .Width = 100
          End With
          DataGridView2.Columns.Add(ExtextColumn)
          DataGridView2.Columns.Add(ExtextColumn1)
          DataGridView2.Columns.Add(ExtextColumn2)
          DataGridView2.Columns.Add(ExtextColumn3)
          DataGridView2.Rows.Add(1000, "山田太郎", 3, 1000)
          DataGridView2.Rows.Add(2000, "山田一郎", 6, 2000)
          DataGridView2.Rows.Add(3000, "山田ニ郎", 4, 2147483648)
          DataGridView2.Rows.Add(4000, "山田三郎", 7, 4000)
          DataGridView2.Rows.Add(5000, "山田四郎", 9, 5000)
          DataGridView2.Rows.Add(6000, "山田五郎", 2, 6000)
          DataGridView2.Rows.Add(7000, "山田六郎", 3, 7000)
          DataGridView2.Rows.Add(8000, "山田七郎", 4, 8000)
          DataGridView2.Rows.Add(9000, "山田八郎", 6, 9000)
          DataGridView2.Rows.Add(9001, "山田九郎", 2, 9000)
      End Sub

     

     

    2007年9月16日 12:06
  • DataGridView2.Rows.Add(1000, "山田太郎", 3, 1000) などの数値(1000)はInt32型で登録され

    DataGridView2.Rows.Add(3000, "山田ニ郎", 4, 2147483648)の数値はInt64型で登録されているために発生しているようです。

     

    1000なども1000Lと書いてInt64型として登録すれば良さそうです。

     

    Code Snippet

            DataGridView1.Rows.Add(1000, "山田太郎", 3, 1000L)
            DataGridView1.Rows.Add(2000, "山田一郎", 6, 2000L)
            DataGridView1.Rows.Add(3000, "山田ニ郎", 4, 2147483648L)
            DataGridView1.Rows.Add(4000, "山田三郎", 7, 4000L)
            DataGridView1.Rows.Add(5000, "山田四郎", 9, 5000L)
            DataGridView1.Rows.Add(6000, "山田五郎", 2, 6000L)
            DataGridView1.Rows.Add(7000, "山田六郎", 3, 7000L)
            DataGridView1.Rows.Add(8000, "山田七郎", 4, 8000L)
            DataGridView1.Rows.Add(9000, "山田八郎", 6, 9000L)
            DataGridView1.Rows.Add(9001, "山田九郎", 2, 9000L)

     

    2007年9月16日 12:44
  • ありがとうございました。

    Lを付加したり、Ctypeでキャストすることにより正常にソートされることを確認できました。

    「.ValueType = Type.GetType("System.Int64")」とすることにより、4列目の数値は、

    Int64型とみなされると思っていました。

    2007年9月16日 15:09