none
dataGridViewで列ソートをより高速にするには? RRS feed

  • 質問

  • 以前に自動ソートの方法をお聞きしました。

    //Viewを取得
    dvSuito.Table = suitoDataSet.suito;
    //ソート実行
    dvSuito.Sort = "sort ASC";
    suitoDataGridView.DataSource = dvSuito;
    
    

    「これは便利」とよろこんでいたのですが,行数が100を超える処理速度がかなり遅くなります。

    500行を超えると実用に耐えるものではありません。

    なにか良い方法はないでしょうか?

     


    zen73
    2010年11月11日 3:08

回答

  • いろいろ調べてみたんですが、DataViewのSortはどうもパフォーマンスが良くないようですね。Connectにも上がっていて次のバージョンで考察するみたいなことが5年前に書いてあったのですが・・・

    Slow performance in DataView
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93608&wa=wsignin1.0

    代替としては、データーベースでソートを行わせた結果を取得し直すか、DataViewを直接バインドせずにListなどのジェネリックコレクションでUIオブジェクトを作成してLinqでソートし、それをバインドするなどが考えられると思います。今回の件に限らず、UIオブジェクトを作るのがスマートだと思います。ただし、ソートのパフォーマンスがどれぐらいでるのかわかりませんし、改修量はかなり多いので、データーベースでソートが現実的なような気がします。UIオブジェクトの件は以下のページの下の方に書かれています。今すぐにこの対応は現行アプリケーションでは難しいと思いますので、将来の参考にされると良いと思います。

    (参考)
    Part 2. スマートクライアントにおける単体入力データ検証
    http://blogs.msdn.com/b/nakama/archive/2009/02/26/part-2.aspx

    ちょっとこれぐらいしか思いつきません。すみません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2010年11月30日 7:19
    • 回答の候補の設定解除 zen73 2010年12月4日 1:35
    • 回答としてマーク zen73 2010年12月4日 1:35
    2010年11月12日 2:38
    モデレータ

すべての返信

  • DataViewのコンストラクタでSortなどが指定でき、この際にインデックスが構築されます。仕様に合うかどうかわかりませんが、可能であればあらかじめインデックスが構築されたDataViewを用意されると、多少は改善されるかもしれません。

    (参考)
    DataView のパフォーマンス
    http://msdn.microsoft.com/ja-jp/library/bb669089.aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年11月11日 5:38
    モデレータ
  • trapemiyaさん,ありがとうございます。

    ご紹介いただいたWebページを読ませていただきましたが,私の頭では理解できません。

    それで,自動ソートはやめて,ボタンをクリックしたときにソートを実行するようにしたいとおもいます。

    「sort」列でソートを実行したいのですが,どのようにするとソートを実行できるのかをお教えいただけませんでしょうか。

     


    zen73
    2010年11月11日 8:42
  • いろいろ調べてみたんですが、DataViewのSortはどうもパフォーマンスが良くないようですね。Connectにも上がっていて次のバージョンで考察するみたいなことが5年前に書いてあったのですが・・・

    Slow performance in DataView
    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93608&wa=wsignin1.0

    代替としては、データーベースでソートを行わせた結果を取得し直すか、DataViewを直接バインドせずにListなどのジェネリックコレクションでUIオブジェクトを作成してLinqでソートし、それをバインドするなどが考えられると思います。今回の件に限らず、UIオブジェクトを作るのがスマートだと思います。ただし、ソートのパフォーマンスがどれぐらいでるのかわかりませんし、改修量はかなり多いので、データーベースでソートが現実的なような気がします。UIオブジェクトの件は以下のページの下の方に書かれています。今すぐにこの対応は現行アプリケーションでは難しいと思いますので、将来の参考にされると良いと思います。

    (参考)
    Part 2. スマートクライアントにおける単体入力データ検証
    http://blogs.msdn.com/b/nakama/archive/2009/02/26/part-2.aspx

    ちょっとこれぐらいしか思いつきません。すみません。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答の候補に設定 山本春海 2010年11月30日 7:19
    • 回答の候補の設定解除 zen73 2010年12月4日 1:35
    • 回答としてマーク zen73 2010年12月4日 1:35
    2010年11月12日 2:38
    モデレータ
  • trapemiyaさん,ありがとうございました。

    その後,いろいろと考えてはいたのですが解決には至りませんでした。それで,この質問は閉じさせていただきます。

     


    zen73
    2010年12月4日 1:35