none
DataGridView を Sort して DataTable に代入していますが、DataTableが反映されていない。

    質問

  • VB2008 を使用しています。

    DataGridView を Sort して DataTable に代入し、そのDataTableを読んで処理しています。

    DataGridView は Sort後に
    DataTable = DataGridView1.DataSource
    をしているのに、DataTable を最初から読んでいくと、最初のDataGridViewに表示された順になっていて、
    Sort後の順になっていません。

    何故だか解らず、お解りの方、返答宜しくお願い致します。
    2009年9月9日 9:02

回答

  • DataGridViewは勝手にはDataTableをソートしてくれません。
    DataGridViewのDataSourceにDataViewを入れて、そのDataView経由で取り出せばソート順になります。

    Public Class Form1
        Inherits Form
    
        Public Sub New()
            Dim btn As New Button()
            btn.Text = "読み出しテスト"
            AddHandler btn.Click, AddressOf ButtonClick
            Me.Controls.Add(btn)
    
            Dim dt As New DataTable()
            Dim col1 As DataColumn = New DataColumn("", GetType(Integer)) _
                With {.Unique = True, .AutoIncrement = True, .AutoIncrementSeed = 0, .AutoIncrementStep = 1, .ReadOnly = False}
    
            dt.Columns.Add(col1)
            dt.Columns.Add()
    
            dt.Rows.Add(Nothing, "A")
            dt.Rows.Add(Nothing, "D")
            dt.Rows.Add(Nothing, "C")
            dt.Rows.Add(Nothing, "E")
            dt.Rows.Add(Nothing, "B")
            dt.Rows.Add(Nothing, "F")
    
            dgv.DataSource = New DataView(dt)
            dgv.Top = btn.Height
            dgv.Height = Me.ClientSize.Height - btn.Height
            dgv.Width = Me.ClientSize.Width
            dgv.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top
            Me.Controls.Add(dgv)
        End Sub
    
        Dim dgv As New DataGridView()
    
        Private Sub ButtonClick(ByVal sender As Object, ByVal e As EventArgs)
            Dim view As DataView = CType(dgv.DataSource, DataView)
            For Each row As DataRowView In view
                System.Diagnostics.Debug.WriteLine(row.Item(0).ToString + "," + row.Item(1).ToString())
            Next
            System.Diagnostics.Debug.WriteLine("")
        End Sub
    End Class
    • 回答としてマーク 菊地俊介 2009年9月24日 9:43
    2009年9月9日 9:35
  • 何故だか解らず、お解りの方、返答宜しくお願い致します。

    DataGridViewのDataSourceにデータテーブルを設定すると、DataGridViewに表示されるのは実際にはそのデータテーブルのデータビューになります。DataGridViewにデータテーブルが直接表示されることはなく、常にそのデータビューが表示されます。DataGridViewはそのデータビューを操作することによって、DataGridViewにおけるソートを実現しています。つまり、データテーブルの並び順を変更しているわけではありません。
    さて、DataSourceにデータビューが指定されず、直接データテーブルが指定された場合、そのデータビューは何になるのでしょうか? それはデータテーブルのDefaultViewプロパティで得られるデータビューになります。したがって、
    CType(DataGridView1.DataSource, DataTable).DefaultView
    で得られるデータビューが、DataGridViewでソートされた並び順になっています。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 菊地俊介 2009年9月24日 9:43
    2009年9月9日 15:01
    モデレータ

すべての返信

  • DataGridViewは勝手にはDataTableをソートしてくれません。
    DataGridViewのDataSourceにDataViewを入れて、そのDataView経由で取り出せばソート順になります。

    Public Class Form1
        Inherits Form
    
        Public Sub New()
            Dim btn As New Button()
            btn.Text = "読み出しテスト"
            AddHandler btn.Click, AddressOf ButtonClick
            Me.Controls.Add(btn)
    
            Dim dt As New DataTable()
            Dim col1 As DataColumn = New DataColumn("", GetType(Integer)) _
                With {.Unique = True, .AutoIncrement = True, .AutoIncrementSeed = 0, .AutoIncrementStep = 1, .ReadOnly = False}
    
            dt.Columns.Add(col1)
            dt.Columns.Add()
    
            dt.Rows.Add(Nothing, "A")
            dt.Rows.Add(Nothing, "D")
            dt.Rows.Add(Nothing, "C")
            dt.Rows.Add(Nothing, "E")
            dt.Rows.Add(Nothing, "B")
            dt.Rows.Add(Nothing, "F")
    
            dgv.DataSource = New DataView(dt)
            dgv.Top = btn.Height
            dgv.Height = Me.ClientSize.Height - btn.Height
            dgv.Width = Me.ClientSize.Width
            dgv.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top
            Me.Controls.Add(dgv)
        End Sub
    
        Dim dgv As New DataGridView()
    
        Private Sub ButtonClick(ByVal sender As Object, ByVal e As EventArgs)
            Dim view As DataView = CType(dgv.DataSource, DataView)
            For Each row As DataRowView In view
                System.Diagnostics.Debug.WriteLine(row.Item(0).ToString + "," + row.Item(1).ToString())
            Next
            System.Diagnostics.Debug.WriteLine("")
        End Sub
    End Class
    • 回答としてマーク 菊地俊介 2009年9月24日 9:43
    2009年9月9日 9:35
  • 何故だか解らず、お解りの方、返答宜しくお願い致します。

    DataGridViewのDataSourceにデータテーブルを設定すると、DataGridViewに表示されるのは実際にはそのデータテーブルのデータビューになります。DataGridViewにデータテーブルが直接表示されることはなく、常にそのデータビューが表示されます。DataGridViewはそのデータビューを操作することによって、DataGridViewにおけるソートを実現しています。つまり、データテーブルの並び順を変更しているわけではありません。
    さて、DataSourceにデータビューが指定されず、直接データテーブルが指定された場合、そのデータビューは何になるのでしょうか? それはデータテーブルのDefaultViewプロパティで得られるデータビューになります。したがって、
    CType(DataGridView1.DataSource, DataTable).DefaultView
    で得られるデータビューが、DataGridViewでソートされた並び順になっています。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 菊地俊介 2009年9月24日 9:43
    2009年9月9日 15:01
    モデレータ
  • 皆様、こんにちは。

    gekkaさん、trapemiyaさん、いつも詳しい回答ありがとうございます。

    fuji-tochigiさん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?
    有用な情報と思われたため、勝手ながらgekkaさん、trapemiyaさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2009年9月24日 9:46