• ベストアンサー

リストビューのソートが2回必要

ListView_SortItemsを使ってリストのアイテムをソートしているんですが、ListView_SortItemsを2回以上呼ぶ必要があるみたいです。1回では正しくソートされない場合があります。ソートが全部終わっていないのに途中でソートが終わってListView_SortItemsが処理を返してしまっているんだと思います。 こういう状況で、見直した方がよさそうな部分があればその部分を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

ListView_SortItemsマクロの戻り値をチェックし、成否を判断してみる。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/macros/listview_sortitems.asp

basukento
質問者

お礼

ListView_SortItemsが戻り値のBOOLで成功かを知ることができるのをすっかり忘れていました。 これもチェックしてみたいと思います。 ありがとうございます。

その他の回答 (1)

  • rara_sun
  • ベストアンサー率50% (271/539)
回答No.1

Cって?C++って?っていう私なので、 まともなコメントができませんが、 もし、ここで有力な情報が得られなければ、 他の方の作ったものをみて参考にしてみる というのは、いかがでしょうか?(提案) http://hp.vector.co.jp/authors/VA016117/explorer3.html http://www.kumei.ne.jp/c_lang/sdk3/sdk_222.htm もし、こういう次元のお話でなければ、ご容赦を・・

basukento
質問者

お礼

じっくりと見直してみます。 ありがとうございます。

関連するQ&A

  • ArrayListのソートについて

    プログラム上でListViewのカラムをクリックするとソートされる プログラムを作ろうと入れたのですが、リストはソートされるのに 中身(ArrayList)がソートされていないためソート後のアイテムを クリックしても違う値しか出てきません。 それにはArrayListのソートが必要と言う事が書いてあったので 実装をしてみたのですが、比較ができないようなエラーが出て うまくソートもできませんでした。 どうすればListViewのカラムソートと連動してArrayListのソートが 出来るようになるでしょうか? 開発環境はVS2005(C#) .NET2.0です。 サンプルクラスは以下の通りです。 public void UpdateListView() { ArrayList list = null; if (listView1.Columns[1].Text == "差出人") { // 受信メールの場合 list = collectionMail[RECEIVE]; } else if (listView1.Columns[1].Text == "差出人または宛先") { // 削除メールの場合 list = collectionMail[DELETE]; } listView1.BeginUpdate(); // リストビューの内容をクリアする listView1.Items.Clear(); // ListViewを設定する foreach (Mail mail in list) { ListViewItem item = new ListViewItem(mail.subject); item.SubItems.Add(mail.address); listView1.Items.Add(item); } listView1.EndUpdate(); } private void Form1_Load(object sender, EventArgs e) { // ListViewにアイテムを追加する for (int no = 0; no < subject.Length; no++) { Mail mail = new Mail(subject[no], address[no], body[no]); collectionMail[RECEIVE].Add(mail); } UpdateTreeView(); UpdateListView(); } public class Mail { public string subject; public string address; public string body; public Mail(string subject, string address, string body) { this.subject = subject; this.address = address; this.body = body; } }

  • リストのソート

    (05967)リストビューがソートしない http://www.mtakahashi.com/old/05975.html と同様だと思われる現象が起きています。 1回目はちゃんとソートされますが、2回目以降のソートは正しくソートされません。 これと同じ現象になった方はいらっしゃいませんか?

  • リストビューでのドラッグ&ドロップでの反転表示

    VC++にてエクスプローラもどきを作成していて、 ドラッグ&ドロップの操作を実装中です。 ListViewにて、OnLButtonDown内で マウスで押下されたフォルダイメージを CreateDragImageで作成しマウスカーソルを変更しました。 そして、ドラッグ中に、別フォルダへカーソルが移動した際、 そのフォルダを反転させるために、 OnDragOver内で、まず、全ての選択状態をクリアし、 for ( i = 0; i < list.GetItemCount(); i++ ){   item.iItem = i;   ListView_GetItem( list, &item2 );   item2.state = 0;   item2.stateMask = LVIS_SELECTED;   ListView_SetItem( list, &item ); } 対象となるフォルダのLV_ITEMを取得後に、 item.state = LVIS_SELECTED; item.stateMask = LVIS_SELECTED; ListView_SetItem( list, &item ); を行い選択状態に変更させました。 一応、ドラッグ&ドロップは、ある程度できているのですが、 描画が汚く、下記の2点について困っています。 1.ドラッグされたフォルダの反転表示が綺麗ではない(画像参照) 2.カーソル下に何のフォルダも無い場合は、   全ての選択状態をクリアだけでDragOverの処理を終了しているが、   前回選択状態にしたフォルダが反転表示(汚い状態で…)されたまま なにか、修正方法はありますでしょうか?

  • リストビューのハンドルについて

    リストビューコントロールのハンドルについて疑問に思う事がありまして、ご教授よろしくおねがいします。 通常リストビューをCreateWindow()で作成した時に戻り値として受け取るウィンドウハンドルに対してSetWindowFont()を行うとリストビュー全体のフォントが変更されます。 リストビュー関数にはListView_GetHeader( リストビューハンドル );という関数が用意されていてリストビューのカラム部分のハンドルを取得できます。 このハンドルに対してSetWindowFont()を行うとカラム部分だけのフォントが変更されます。 という事はアイテム部分だけのハンドルを取得し、SetWindowFont()でフォントを変更する事はできるのでしょうか? ご教授よろしくお願いいたします。

  • リストコントロールにセットするイメージリストについて

    こんにちは。 Windowsでレポート状態表示のリストコントロールについて質問です。 リストコントロールははオーナーデータで表示しています。 一覧でアイテムの横にアイコン(ビットマップ)を表示しています。 またソートできるようにし、コラム部分には昇順か降順か分かるように▲▼が 表示されるようにしようと思っています。 リストコントロールに表示するアイテム用のイメージリストとヘッダー コントロール用のイメージリストを用意し、リストコントロールと リストコントロールから取得したヘッダーコントロールにそれぞれ 追加したのですが、 Header_SetImageList(ヘッダーコントロールのウィンドウハンドル) ; ListView_SetImageList(リストコントロールのウィンドウハンドル) ; 上記の順番では後から追加したイメージリストで上書きされてしまいました。 Header_GetImageListでイメージリストを取るとListView_SetImageListで セットしたイメージリストのハンドルが取得されます。 リストコントロールでイメージリストを取り扱う場合はリストアイテムも ヘッダーも一つのイメージリストで管理しなければならないのでしょうか ?

  • リストビューのスクロール

    お世話様です。 C#.NET(1.1)でプログラミングしています。 リストビューですが以下の設定を行っています。 CheckedBox=true View=List MultiSelect=true Scrollable=true ※カラム関係は何も設定してません。 この設定で、アイテムをどんどん追加していき、ListViewの最大高さまで アイテムが埋まると、水平スクロールが表示され2列目が表示されるのですが、これを垂直スクロールで下に追加という形をとりたいのですが、 どうしたらいいのかわからないです。 (なぜCheckListBoxにしないのかというのは、複数選択ができないからです。) ご存知の方、ご教授願います。(××)

  • STLのlistのソートについて教えてください。

    STLで何か作ってみようと思っているのですが、複数のメンバを持つ構造体オブジェクトのリスト(要素の値が構造体オブジェクトであるリスト)を、その構造体オブジェクトのメンバの中の1つのをキーとして昇順、又は降順にソートしようとした場合、どのようにすればよいのでしょうか?? http://www5c.biglobe.ne.jp/~ecb/cpp/07_08.html ここを見ると、sort() という関数があるようですが、単に昇順でソートする、としか書いていなく、構造体のリストのソートはどうするのだろうと疑問です。 詳しい方いらっしゃいましたらご教授頂けると幸いです。

  • STLのList.sortが上手く使えない

    VC++2005のSTLの、List.sort()を使ってメンバ変数aでソートしたいのですが上手くいきません。 MSDNで"IComparerをオーバーロードしろ"と、書いてあったのを見て、 いろいろ調べて試してはみたのですが、理解不足のため全て失敗しました。 ネットに転がっているサンプルはC#のモノばかりでサッパリです。 調べる手段も分からず八方塞な状態です。どうかお力を貸してください。お願いします。 class TestList { protected: std::list<TestList*> RunList; int a; //この変数でソートする public: MakeList(TestList *test); //リストを"RunList"に登録する }; void main() { TestList Test(); //全てのリストはココに登録 Test->MakeList(new TestList()); Test->MakeList(new TestList()); Test->RunList.sort(); //←ココ。メンバ変数aでソートしたい } 【追記】MSDNの方法では"mscorlib.dll"が必要になります。 もし可能なら違う方法になったとしても、使うことなくソートできるなら、その方が良いです。

  • 大きいリストから必要なものを小さいリストへ。

    A列に商品名、B列にメーカーの商品番号、C列に自分の会社での番号、D列に金額などが全部で5000点以上入ったリストがあります。その中から、必要なものを別のリスト一覧にしたいのです。自分の会社の番号を打ち込むだけでその他の金額などもズバーっと入ってしまう関数ってあるのでしょうか。全部打ち込むのは非常に手間がかかってしまい、何かいい方法はないでしょうか・・・。よろしくお願いいたします。

  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl