Top > プログラミング > .NET Tips> ListViewの項目を並び替える

ListViewの項目を並び替える」への評価、コメント

評価

良い / 悪い = 43 / 5 (「良い」の割合 = 0.896 , 人気度 = 1.506

評価する

コメント一覧


評価の理由
C#初心者 2020/07/7 (Tue) 17:40:28
評価:良い
とても分かりやすい記事です。無事に動きました。有難うございます。

通常のコメント
cdg 2014/03/20 (Thu) 17:24:22
評価:良い
いつも、お世話になっています。(^_^;

自分でソート対象にしたくない項目をListViewItemComparer.ComparerMode.None
を追加して"0"を返す様に改造しました。

ありがとうございます。

通常のコメント
an 2013/11/5 (Tue) 10:48:15
返信ありがとうございます。

確かにCompareToが最適のようですね。
当方VB6あがりなもので、未だに各クラス(今回は構造体?)のメンバを把握しきれていない現状です・・・。

そのアイディア使わせて頂きます!

通常のコメント
管理人 2013/11/2 (Sat) 01:02:00
> 本件のIComparer.Compareの実装のCompareメソッドについてですが、たとえば引数Xの値がIntegerの最大値で引数yの値がマイナス値の場合に、計算結果がIntegerの範囲外の値となるので、エラーになるようです。

素直にCompareToを使うべきだったと後悔しています。Math.Signも面白いアイデアだと思いますが、二度手間になってしまいそうです。ご指摘いただき、ありがとうございました。

通常のコメント
an 2013/11/1 (Fri) 16:05:51
いつも大変参考にさせていただいております。

さて本件のIComparer.Compareの実装のCompareメソッドについてですが、たとえば引数Xの値がIntegerの最大値で引数yの値がマイナス値の場合に、計算結果がIntegerの範囲外の値となるので、エラーになるようです。

戻り値のInteger型と内部的にParseしているInteger型は同じInteger型でも特に関係性はなく、戻り値はIComparer.Compareに依存しており、内部的の型は比較する値の入力範囲に依存していると思われます。

また、数値の範囲(入力範囲)についてはこのサンプルプログラムを適用するプログラム単位で調整すれば良いと考えますが、根本的に本メソッドの戻り値としてStringやDateTimeと違いに違和感を覚えます。

IComparer.Compareの戻り値を考えると、どれだけの差があるかというのは重要ではなく、どちらが大きいか(または同じか)というのが重要だと思うので、計算結果をMath.Signにて他と統一した方が良いのではと感じましたが、いかがでしょうか?
(とはいえMath.Signする前に今定義されている型より大きい値が扱える型にキャストしないと前述の例ではエラーになってしまいますが・・・)

通常のコメント
管理人 2013/10/15 (Tue) 00:07:01
> AndAlso にしないと _columnModes Is Nothing の時に _columnModes.Length でエラーとなりました。

修正させていただきます。ご報告有り難うございました。

通常のコメント
匿名 2013/10/11 (Fri) 10:34:53
参考にさせていただきました。
ありがとうございました。

なお、さらに拡張 - VB.NET - 108行目について
AndAlso にしないと _columnModes Is Nothing の時に _columnModes.Length でエラーとなりました。

通常のコメント
管理人 2012/03/5 (Mon) 00:41:42
Myaさん、ご連絡ありがとうございました。公開させていただいたWikiのページにもコメント欄がありますので、何かありましたら、そちらに書き込んでいただいても大丈夫です。また、もし公開を中止して欲しいということがありましたら、ご連絡ください。よろしくお願いいたします。

通常のコメント
Mya 2012/03/4 (Sun) 01:36:01
 はうっ! 久し振りにListViewを使う機会が来たので復習がてらコチラをお邪魔しましたら、何かもの凄い汗顔恐悦の至りに!? 私何ぞのソースコードを公開して下さって本当に有り難う御座いますガクブル……。何とも畏れ多い限りです。
 このbool値比較の注意点としては、「ListViewに於けるCheckBoxのCheck有無はListViewItemに対してのみ一対一で格納されている」ので、(大凡はそうなのですが)Sort後にCheckBoxを操作した場合、「ListViewItemとListViewのデータ元に整合性を紐付けてやらないとCheck対象がずれる」のがミソですね。ListVeiwItemをSortしてもデータ元は無論ながらSortされないので、そのままの行数でBool値を獲得した場合はCheckBoxの対象がずれちゃいます。
 然るに、この整合性の擦り合わせは大抵、ColumnClickのタイミングでやって整合性を付けてやると恐らく最も面倒がないです。長文、失礼致しました。

通常のコメント
管理人 2012/02/7 (Tue) 01:59:50
> ''' <param name="cmod">並び替えの方法</param>
> ではありませんか?

修正させていただきます。以前から指摘されていたにも関わらず遅れてしまい、申し訳ありませんでした。

また、こちらも遅くなってしまいましたが、以前Myaさんから送っていただいた、チェックボックス付きのListViewの項目を並び替えるコードを以下のURLで公開させて頂きました。

http://wiki.dobon.net/index.php?cmd=read&page=DOBON.NET%2Fnote%2FCheckBox%A4%CE%C9%D5%A4%A4%A4%BFListView%A4%CE%B9%E0%CC%DC%A4%F2%CA%C2%A4%D3%C2%D8%A4%A8%A4%EB

評価の理由
匿名 2011/10/30 (Sun) 09:24:11
評価:良い
DGVのように自動的に並び替えてはくれないようで、悩んでいたところだったので非常に参考になりました。

通常のコメント
匿名 2011/07/9 (Sat) 17:39:41
2つ目のコードのVB版ですが
''' <param name="col">並び替える列番号</param>
''' <param name="ord">昇順か降順か</param>
''' <param name="mthd">並び替えの方法</param>

''' <param name="col">並び替える列番号</param>
''' <param name="ord">昇順か降順か</param>
''' <param name="cmod">並び替えの方法</param>
ではありませんか?

評価の理由
鈴木 哲 2011/05/1 (Sun) 18:24:30
評価:良い
すばらしい!!
一点だけ補足。DBから一万件ほどのデータを読み出してListViewに追加したのですが、ListViewItemSorterプロパティがセットされたままだと、一レコード追加するごとにソートが実行され、とんでもなく時間がかかってしまいました。
ListViewItemSorterにnullをセットしてからアイテムを追加し、改めてListViewItemSorterを再セットしたところとっても快適に動きました!
ありがとうございます!

評価の理由
kichaman 2010/12/5 (Sun) 20:03:17
評価:良い
すぐに導入できた

通常のコメント
かえ 2010/11/9 (Tue) 19:29:21
リストビューの、例えば2列目をあらかじめ降順に並べ替えた状態で表示させたいときはどうすればよいのでしょうか?

通常のコメント
管理人 2010/06/12 (Sat) 01:09:57
> 拡張致しました論理値比較演算のコードをメールにて送付致しました。

わざわざメールを送って頂き、ありがとうございました。機会がありましたら、このサイトで紹介させていただきたいと思います。

通常のコメント
Mya 2010/06/11 (Fri) 02:11:27
 いえいえ、本当に心から助かりましたので私の方から礼を申し上げることは御座いましても、管理人様から頂く理由は御座いませんよ。本当に有り難う御座いました。

 尚、お節介とは思いましたが拡張致しました論理値比較演算のコードをメールにて送付致しました。もし参考になるようでしたら、後の方の為にもお役立て下さると冥利に尽きます。
 改めて、本当に有り難う御座いました。

 Mya拝

通常のコメント
管理人 2010/05/25 (Tue) 01:22:19
Myaさん、わざわざご報告いただいて、ありがとうございます。そして、本当にお疲れさまでした。私の書いたものがお役に立ちましたら、幸いです。これからもよろしくお願いいたします。

通常のコメント
Mya 2010/05/24 (Mon) 18:50:57
 改めて、上記のソースコードを参考にした独自のIComparer継承クラスが完成致しましたので厚く御礼申し上げます。開発ログを見るとColumnのソート処理に取りかかったのが5月16日。完成が本日の5月24日たった今ですが、このドキュメントがなければ倍は時間がかかっていた事、推測に難くないです。本当に有り難う御座いました。

 私なりとしてListViewへの付属機能としてCheckBoxがtrueになっている状態のbool比較処理も追加しましたが、明らかに後付けのリフォームであるという処理で苦笑しております。七面倒くさい上に鈍くさい事してますよ、ホント。
 それでは改めまして、有り難う御座いました。

評価の理由
Mya 2010/05/21 (Fri) 15:17:22
評価:良い
 このコードを足掛かりにMicrosoftのオンラインドキュメントを併用して理解に役立てる事が出来ました。有り難う御座います(といいつつも未だ足踏み状態ですが、亀の歩みで何とか進んでいると思いたいです……)。

評価の理由
Yossy 2010/05/5 (Wed) 10:01:09
評価:良い
ありがとうございます。大変助かりました。列ごとの並べ替え方法を配列で渡すプロパティは、すばらしい工夫と思います。

通常のコメント
くろっきー 2010/04/23 (Fri) 13:23:55
多機能版ListViewItemComparerのコンストラクタの3番目の引数の名前がコメントと違うと警告が出ます。実害は無いですけど。

通常のコメント
furi 2010/03/3 (Wed) 02:45:27
listView1.items.Clear()
をするとエラーが出てしまいます

通常のコメント
仕事中 2009/10/14 (Wed) 14:01:27
素晴らしいです。まさにこれです。ありがとうございました。

通常のコメント
michihata 2009/06/15 (Mon) 10:49:50
ありがとうございました。

評価の理由
Merrypark 2006/12/10 (Sun) 14:38:05
評価:良い
VB6からのアップグレードで利用させていただきました

評価の理由
へろ象 2006/11/10 (Fri) 13:46:00
評価:良い
すばらしい。丁度私が求めていた内容でした。
コピペするだけですんなり動きました。
すごくすっきりコーディング出来ました。

通常のコメント
かふぺち 2005/09/28 (Wed) 17:33:09
評価:大変良い
ドンピシャです。
ありがとうございました。

通常のコメント
きん 2005/06/21 (Tue) 17:00:33
とても分かりやすく書いてます。

評価の理由
のび 2004/09/3 (Fri) 13:34:29
評価:良い
探してたものがどんぴしゃりでありました。助かりました。
p.s.
ListViewItemSorterを設定すると、自動的にSort()メソッドが呼び出されるらしいです(msdnより)。

評価の理由
いさいさ 2004/08/11 (Wed) 13:35:47
評価:良い
助かりました。
ありがとうございます。

コメントの投稿

[説明]