datagridviewのソートについて

解決


らら  2010-08-24 17:08:52  No: 147130  IP: [192.*.*.*]

VB.NET にて datagirdviewを使っており
それぞれのカラムをクリックした際にそれぞれの項目でソートすると思うのですが。
rows.add した際に一番下にいってしまいソートを維持できないです 何かいい方法はないでしょうか?
継続的にデータがはいってきて 2000行、3000行、時には1万を超えることもあるので いろんなサイトでソートを試してみたのですが
全部をみてソートするようでとても重かったので何かいい方法がないか相談してみたところです。

編集 削除
魔界の仮面弁士  2010-08-24 18:00:01  No: 147131  IP: [192.*.*.*]

ひとつ確認。
データの追加は、以下のいずれで行っていますか?

(1) DataGridView に対して、直接 Rows.Add している。
(2) DataGridView にバインドした DataTable を Rows.Add している。
(3) 中継している BindingSource を通じて AddNew している。

編集 削除
らら  2010-08-24 18:05:50  No: 147132  IP: [192.*.*.*]

1ですね  直接  Rows.Addしてます


こんな状態で質問してしまい申し訳ありません。

編集 削除
魔界の仮面弁士  2010-08-24 19:31:26  No: 147133  IP: [192.*.*.*]

> 時には1万を超えることもあるので 
そこまで行くと、DataGridView仮想モードが必要かも…。
(処理が複雑化するので、個人的にはお奨めできませんが)


> 1ですね  直接  Rows.Addしてます
であれば、(2)か(3)の手法に切り替えてみて下さい。

これならば、行を追加するとソートされた位置に表示されますので、
再ソートの手間もかかりません(サンプル後述)。
もちろん、既存のコードの手直しは必要になりますが…。


どうしても (1) の手法を使い続けるとなると、そもそも Rows.Add が
末尾行への追加を意味する物なので、そのままではどうしようもありません。
途中の行に挿入するために Rows.Insert を使うようにするか、もしくは、
.Rows.Add した後に .Sort 等で再ソートする必要が生じます。

編集 削除
魔界の仮面弁士  2010-08-24 19:33:11  No: 147134  IP: [192.*.*.*]

> (サンプル後述)
DataGridView1 が、(1) の直接 Rows.Add。
DataGridView2 が、(2) のデータバインド法です。


Imports System.ComponentModel
Public Class Form1
    Private tbl As DataTable

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        DataGridView1.ColumnCount = 4
        DataGridView1.Rows.Add("1-1", "1-2", "1-3", "1-4")
        DataGridView1.Rows.Add("2-1", "2-2", "2-3", "2-4")
        DataGridView1.Rows.Add("8-1", "8-2", "8-3", "8-4")
        DataGridView1.Rows.Add("3-1", "3-2", "3-3", "3-4")
        DataGridView1.Sort(DataGridView1.Columns(0), ListSortDirection.Ascending)

        tbl = New DataTable()
        tbl.Columns.Add("Col1")
        tbl.Columns.Add("Col2")
        tbl.Columns.Add("Col3")
        tbl.Columns.Add("Col4")
        DataGridView2.AutoGenerateColumns = True
        DataGridView2.DataSource = tbl
        tbl.Rows.Add("1-1", "1-2", "1-3", "1-4")
        tbl.Rows.Add("2-1", "2-2", "2-3", "2-4")
        tbl.Rows.Add("8-1", "8-2", "8-3", "8-4")
        tbl.Rows.Add("3-1", "3-2", "3-3", "3-4")
        DataGridView2.Sort(DataGridView2.Columns(0), ListSortDirection.Ascending)
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        DataGridView1.Rows.Add("0-1", "0-2", "0-3", "0-4")
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        tbl.Rows.Add("0-1", "0-2", "0-3", "0-4")
    End Sub
End Class

編集 削除
らら  2010-08-24 19:35:50  No: 147135  IP: [192.*.*.*]

解答ありがとうございます。  2.3の手法は行ったことも無くまったく??状態です  サンプルをあとで書いていただけるとの事で大変たすかります。  .sortも試したのですが  行数が多すぎるとFormが固まりあまり・・・でしたので質問させていただいたしだいです。

編集 削除
三木谷一浩  2010-08-24 21:04:11  No: 147136  IP: [192.*.*.*]

DataGridView
を自作すれば。
オールカスタム。

VBは簡単だから、やれますよ。

以上。

編集 削除
らら  2010-08-24 21:20:55  No: 147137  IP: [192.*.*.*]

ありがとうございます。結構いろいろ書いてあるので
大幅な変更がいりますが  一度ためしてみますw。

編集 削除