• ベストアンサー

ListViewの項目を入れ替える

C++で詳細表示のリストビューを扱うプログラムを書いているのですが あるボタンを押すと選択した項目が上や下に移動するようにしたいんです そのためには選択した項目とその上下の項目を入れ替えたらいいと思うのですが やり方がわかりません ListView_SortItemsマクロを使ってみましたが、ある二つの項目だけを入れ替えるのは できなさそうです。 MFCを使わない方法があればうれしいです

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

  • ベストアンサー
回答No.1

ちょっと面倒だとは思いますが、LVM_GETITEM で入れ替え対象の行の情報を取得して、LVM_SETITEM で入れ替えてセットするくらいしかないんじゃないでしょうか。 いっそのこと Virtual ListView にしておくと、入れ替えは楽かもしれないですね。 http://msdn.microsoft.com/en-us/library/bb774736(v=vs.85).aspx#Using_Virtual_ListView_Controls

Sweet_potato
質問者

お礼

やはりその方法しかありませんでしたか 大変だったけどListView_GetItemとListView_SetItemで行を入れ替え 選択状態も入れ替える関数を作れました ありがとうございます

その他の回答 (1)

回答No.2

あまり手間は変わらないかもしれませんが、 (1) 移動する行を GetItem で情報取得 (2) (1)の行を削除 (3) (1)で取得した内容を移動先の行にInsert という手もありましたね…。

Sweet_potato
質問者

お礼

またアドバイスありがとうございます 一応確実な前の方法を使いたいと思います

関連するQ&A

  • ListView_DeleteItemの挙動

    リストビューでチェックされた項目を削除したくて下のようなプログラムを書いたのですがうまくいきません どうもListView_DeleteItemに問題があるらしいのは分かるのですが、それ以上のことが分かりません どなたかご教授お願いします index = ListView_GetItemCount(hList); for(i=0;i<index;i++){ if(ListView_GetCheckState(hList,i) != 0){ ListView_DeleteItem(hList,i); } }

  • ListViewについて

    いつもお世話になっています。 タイトルの通り、ListViewについて2つ質問があります。 (1)ListViewにDBから検索したデータを代入してますが、動きが遅いんです。  各項目ごとで色を変更したりするためだと思いますが、ListViewの表示を速くする方法はなにかありませんか?  ちなみに今は、ListViewを2枚使って、データをセットしている間は、VisibleをFalseにして、  データセットが完了した時点で、Trueに切り替えています。 (2)(1)の動きで、ListViewを使っているところ、今表示されているListView(Iとします)で  クリックしたデータを次に表示させるListView(IIとします)に引き継がせたいです。  Iで、選択している行をIIで選択状態にすることはできたのですが、  Iで選択している行がスクロールして下にあった場合、IIでもスクロールした場所に  ListViewを移動させたいのですが、その方法が分かりません。 何かご存知の方がいましたら、教えてください。 よろしくお願いいたします。

  • delphiにて(listviewでのDrag&Drop)

    タイトルの通りです。 listview(vsReport)で、Drag&Dropで 項目を上下に移動させたいのですが、 ヘルプやネットで検索しても、いまいちヒットせず、 ツリーの時のようにMoveToがないようなので、 どういうふうにしたらいいかつまっています。 単純ソートでは、思うように並んでもらえないし…。 もしくは、ListView上の右クリックのポップアップメニューで 選択した項目を「一つ上に」「一つ下に」という形でも いいのですが、試してみてもどうも思ったように 機能してくれません。 上記どちらでもいいのですが、その考え方というか、 作業手順、ヒントみたいなものでも結構なので、 どなたか教えていただけないでしょうか? また、上記内容に関するサンプル等公開しているページがあれば、 教えていただけるとありがたいです。 よろしくお願いします。

  • エクセルVBA リストビュー選択項目を別フォームへ

    皆さんこんにちは。 エクセル2013使用のVBA初心者です。 エクセルVBAのリストビューについて教えてください。 Userform1上にListview1とコマンドボタン1があります。 Listview1はSheet1を呼び込んだものが反映されており 左から駅名・顧客名・店舗名が記載されています。 Listview1でどれかを選択してコマンドボタン1を押したら Listview1で選択した項目の 駅名をUserform2のTextbox1に 顧客名を〃のTextbox2に 店舗名を〃のTextbox3に反映したいのですが リストビューの情報がネット上にも少なく コードをどのように書いたら良いか見当がつきません。 Userform2のPrivate Sub UserForm_Initialize()に TextBox1 = UserForm1.ListView1.FocusedItem.SubItems(0).Text を記載してみたものの、コンパイルエラーが出てしまいます。 (スイマセン、あまり意味が分かっていないで書きました) リストビューで選択した項目を別のユーザーフォームに 反映させるにはどうしたら良いでしょうか? どなたかヒントをいただけると助かります。

  • 【ListView】選択した項目を取得

    VB6の環境です。 リストビューで、選択した項目を ダブルクリックで取得したいと思います。 どのような方法があるか教えてください。 リストボックスのように扱えなくて苦戦しております。

  • ListViewで、PageDownキーイベントを発生させるには?

    VB6で開発しています。 ラベルとListViewのみのフォーム上で、 PageUpやPageDownキー押下で、イベントを発生させたいのですが、 PageDownを押下すると、ListView内のリストのカーソルが下に移動してしまい、 (フォーカスが当たるコントロールがListViewしかないためと思われますが) イベントが発生せずに困っています。 自分で実現しようとしてできなかった方法を紹介します ・リストビューにフォーカスが当たらないようにする。   Enabled = Falseだとスクロールバーが使えないので困る。    ・ListViewはEnabled=Falseにし、スクロールバーコントロールを使って、スクロールさせる。   スクロールさせる方法が見つかりませんでした。 何か、よいアイデアや方法があれば、ご教授宜しくお願いしますm(_ _)m

  • C# ListView内の検索機能について

    C#にて次のようなアプリを作成しています。 まず、MainであるForm1に、ListViewと<追加>ボタンがあります。そのボタンを押下すると入力Form(Form2)が表示されます。Form2ではListViewに追加したい項目を入力し、Form2内の<リスト追加>ボタンを押下のタイミングでForm1のListViewにその項目が追加されていきます。 MainのForm1には<検索>ボタンと検索キーワード入力テキストが用意されていて、ボタン押下のタイミングでForm1内のListViewの項目と照らし合わせ、同じ項目があれば、その項目をForm3のListViewに追加/表示させようと考えています。 この"検索"の機能が実装できません。 string keyWord = textBox1.Text; ListViewItem foundItem = listView1.FindItemWithText(keyWord, true, 0, true); if (foundItem != null) { fm3 = new Form3(); fm3.listView1.TopItem = foundItem; } fm3.Show(); 上記のように考えていますが、うまくいきません。 エラーはありません。 どうにか検索機能を実装させるために、どうか皆さんアドバイスのほど、よろしくお願いいたします。

  • ListViewの複数項目削除で再度質問です

    ArrayListのソートの件とListViewのおかしな挙動は解決できたのですが 最初に質問して解決したはずの削除の部分で再び分からなくなって しまったので質問させて頂きます。 今回は本体に今までのコードを正式に組み込んで、動作の確認を 行っていたのですが、複数件(連続や個別選択)のデータ削除を 行おうとしたら意図しないデータ(未整列状態の並びのデータ)が 削除されてしまうという事態が発生してしまいました。 これはどうすれば解決できるのでしょうか? また複数件の未読既読を制御(選択された項目に対してフラグを 入れ替える)するのも同様の方法で出来るのでしょうか? 環境はVS2005(C#)、.NET Framework2.0です。 以下に問題の削除時のコードを載せます。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[RECEIVE][sel_index]); collectionMail[RECEIVE].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ // 送信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[SEND][sel_index]); collectionMail[SEND].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "差出人または宛先"){ // 削除メールのとき if(MessageBox.Show("選択されたメールは完全に削除されます。\nよろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK){ for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].RemoveAt(sel_index); } } this.textBody.Text = ""; } } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); // 選択している位置がリストの件数よりも少ないとき if(currentRow < listView1.Items.Count){ // 選択していた位置-1の行にフォーカスを当て直す listView1.Items[currentRow - 1].Selected = true; listView1.Items[currentRow - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } else{ // リストの件数が1以上の時 if(listView1.Items.Count > 0){ // ListViewの行数位置-1の行にフォーカスを当て直す listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items[listView1.Items.Count - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } } }

  • リストボックス項目の順番を入れ替える方法

    リストボックス内に10個ほどの項目があります。 ある項目を選択し、ボタンAをクリックすると、その項目が1つ上に移動し、 ボタンBをクリックすると、その項目が1つ下に移動するようにしたいのです。 ウグイス ホトトギス フラミンゴ ↓ フラミンゴを選択し、ボタンAをクリックします。 ↓ ウグイス フラミンゴ ホトトギス 使用ツールはVB.NET2003です。 テキストファイルから読み込んだデータをリストボックスに入れ、順序を入れ替えてから、上書き保存しようとしております。 何か良いアイディアありましたら、是非教えてください。 どうぞよろしくお願いします。

  • ListViewの複数項目削除で意図しない挙動

    前回質問した内容でほとんど複数削除は解決したように 見えたのですが、どういう条件か分からないのですが 複数選択(1件選択の場合は発生しない)して削除ロジックを 実行すると選択している項目と異なる内容の配列(ArrayList)の データを削除してしまうという事が発生します。 これは何が原因で発生しているのでしょうか? またこれの解決法をご教授頂けないでしょうか。 環境はVS2005(C#)、.NET Framework2.0です。 以下に該当部分のコードを載せます。 2000文字を超えてしまったので問題の部分以外は省略しました。 ※添付画像が見にくかったので以下のURLに再掲示しましたので 参考にしてもらえるとありがたいです。 http://angelteatime.punyu.net/questionbox_20090312.jpg 画像では350件ある受信メール(ArrayListに1件ずつMailクラスで 格納されている)の先頭から8件ぐらい選択削除をしようとしている 画面です。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { int nIndex = (int)listView1.Items[sel_index].Tag; if (listView1.Items[sel_index].SubItems[1].Text == ((Mail)collectionMail[RECEIVE][nIndex]).subject) { collectionMail[DELETE].Add(collectionMail[RECEIVE][nIndex]); collectionMail[RECEIVE].RemoveAt(nIndex); } else{ MessageBox.Show(string.Format("選択した件名と削除するデータが異なっています。\nリスト位置件名:{0}\n実位置件名:{1}\n(リスト位置:{2}, 実位置:{3}", listView1.Items[sel_index].SubItems[1].Text, ((Mail)collectionMail[RECEIVE][nIndex]).subject, sel_index, nIndex), "エラー", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ (上記のRECEIVEがSENDに変更のみでロジック変更なし) } else if(listView1.Columns[0].Text == "差出人または宛先"){ (上記のDELETEに変更されDELETEの配列に格納されたデータを削除) } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); (ListViewのフォーカスを設定し直す) }

専門家に質問してみよう