none
列でリスト ビュー コントロールを並べ替える方法 RRS feed

  • 質問

  • はじめまして。

    http://support.microsoft.com/kb/319401

    上記のサイトを参考にして
    列でリスト ビュー コントロールを並べ替える方法を実現したのですが
    この通りに実装しても

    X 0
    X 1
     ・ 
     ・ 
     ・ 
    X 9
    X 10
    X 11
    X 12

    とあった場合、
    ソートすると
    昇順で

    X 0
    X 1
    X 10
    X 11
    X 12
    X 2

    降順で

    X 2
    X 12
    X 11
    X 10
    X 1
    X 0

    と言ったソートをします。

    これを
    標準的なソート、
    X 0
    X 1
    X 2
    X 10
    X 11
    X 12

    にするにはどうすれば良いでしょうか?

     

    2009年6月26日 7:28

回答


  • EXCELでもフォルダでもソートすると
    X 0
    X 1
    X 2
    X 10
    X 11
    X 12
    なるので
    これが世の中の標準化と思っていました。
    人の目から見た場合の自然なソートの形ですね。
    プログラミングの世界での一般的なソートは、文字コードでのソートですので、その文字の組み合わせでどのような意味があるか、例えば数値としての意味があるかまでは意識しません。


    さて、Explorer等のようなソート(論理ソート)を実現するための比較関数として、Windows XP以降になりますが、StrCmpLogicalWというAPIがあります。
    毎回P/Invokeでの呼び出しとなるため、コストがかかるかもしれませんが、ご紹介しておきます。

    http://msdn.microsoft.com/en-us/library/bb759947(VS.85).aspx

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク shino_ 2009年7月2日 15:20
    2009年6月26日 15:11
    モデレータ

すべての返信

  • shino_さんの期待されたSort順は標準的ではないのです。
    というかそこまで気の利いたSortはやってくれず、単純に文字コード順にソートされています。
    独自の方法で比較したいときはObjectCompare.Compareを使わないで自前で比較関数を書いてください。
    リンク先にも同様の趣旨のことが書いてありますね。先頭の文字列を除去して数値部分だけ取り出して、数値型に変換してから数値の大小を比較するイメージです。
    compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);

    http://www.mahoroba.ne.jp/~mw_ken
    2009年6月26日 8:18
  • 上記 KB の概要の中に

     なお、この例では列のすべてが「文字列」という形でソートされます。 異なる方法で並べ替えする場合 (など数値) を使用する方を並べ替え方法で、次のコード行置き換えることができます:

      ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);

    と書かれていますので、その通りに比較コードを置き換えればよいと思います。
    今回のケースですと、数値に直してから引き算するのですかね。(左の X と右の数値部分が別のカラムだとして。)
    2009年6月26日 8:19

  • EXCELでもフォルダでもソートすると
    X 0
    X 1
    X 2
    X 10
    X 11
    X 12
    なるので
    これが世の中の標準化と思っていました。

    Xは例えばの例なので実際にはユーザーが入力した文字列をソートしなくてはなりません。

    独自の方法を考えて見ます。
    2009年6月26日 9:51

  • EXCELでもフォルダでもソートすると
    X 0
    X 1
    X 2
    X 10
    X 11
    X 12
    なるので
    これが世の中の標準化と思っていました。
    人の目から見た場合の自然なソートの形ですね。
    プログラミングの世界での一般的なソートは、文字コードでのソートですので、その文字の組み合わせでどのような意味があるか、例えば数値としての意味があるかまでは意識しません。


    さて、Explorer等のようなソート(論理ソート)を実現するための比較関数として、Windows XP以降になりますが、StrCmpLogicalWというAPIがあります。
    毎回P/Invokeでの呼び出しとなるため、コストがかかるかもしれませんが、ご紹介しておきます。

    http://msdn.microsoft.com/en-us/library/bb759947(VS.85).aspx

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク shino_ 2009年7月2日 15:20
    2009年6月26日 15:11
    モデレータ