質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

8710閲覧

C#ListView D&DでItemの移動方法

happy0x0

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/03/07 09:34

###前提・実現したいこと
C#を用いてListViewのアイテムをドラッグアンドドロップで位置を移動したいです。
列1のItemをD&Dして列3に移動する等
その際に、サブアイテムも一緒に移動したいと考えています。
調べては見たものの、目的と同じものが見当たらず、質問させて頂きます。

こちらのサイトでリストボックスで似たような処理が書いてありました。
http://www.kisoplus.com/sample2/sub/listbox.html
こちらのリストボックスの処理をサブアイテムを含めたリストビューにて行いたいと考えています。
###補足情報(言語/FW/ツール等のバージョンなど)
C# ビジュアルスタジオ2015 Windows Form Application

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

投稿2017/03/07 09:51

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happy0x0

2017/03/08 08:58

回答有難うございます! URL先の処理は一度試しているのですが、 うまく動作が出来ませんでした。 URL先はViewのスタイルがList型ので サブアイテム含むDetails型で行っているのが関係しているのかなと。。
Zuishin

2017/03/08 09:04

本当にそこが問題なのか、一度 List 型にして試してもらえますか? この ListView というのは Explorer で使われている物そのものです。 Details 型かどうかは普通は関係ありません。
happy0x0

2017/03/09 07:43

どうやら型は関係なかったようです;すみません。 試してみたところ、 listView1.Items.Add("test1"); listView1.Items.Add("test2"); 1つ追加だとD&Dの移動はうまくいくのですが、 string[] item1 = { "test1", "test1"}; listView1.Items.Add(new ListViewItem(item1)); string[] item2 = { "test2", "test2"}; listView1.Items.Add(new ListViewItem(item2)); 複数のアイテムを追加した時に動作がおかしくなってしまい、正常に動作しない現状です。 具体的な現象は1つ目をD&Dすると2つ目のテキストが消えてしまいます。 複数同時に移動したいのですがどうしたらよいでしょうか…。
Zuishin

2017/03/09 07:51

そんなことはないと思いますがねえ。また後で作ってみます。
happy0x0

2017/03/09 07:51

現在のコードを記載いたします。 private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { listView1.DoDragDrop((ListViewItem)e.Item,DragDropEffects.Move); } private void listView1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(ListViewItem))) { e.Effect = DragDropEffects.Move; } } private void listView1_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(ListViewItem))) { Point p = this.listView1.PointToClient(new Point(e.X, e.Y)); ListViewItem item = this.listView1.GetItemAt(p.X, p.Y); if (item != null) item.Selected = true; } } private void listView1_DragDrop(object sender, DragEventArgs e) { // ドラッグできるアイテムが存在するかチェックします。 if (e.Data.GetDataPresent(typeof(ListViewItem))) { ListViewItem srcItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); // Point p = this.listView1.PointToClient(new Point(e.X, e.Y)); ListViewItem item = this.listView1.GetItemAt(p.X, p.Y); int destIndex = this.listView1.Items.IndexOf(item); // アイテムが存在しない場所を選択すると、IndexOf() が -1 を返すので、 // その場合はリストの最後に追加するようにします。 if (destIndex == -1) destIndex = this.listView1.Items.Count; else if (destIndex > srcItem.Index) // 移動先が自分自身より下の場合、選択した場所より1つ下に挿入する。 // 自分自身より上の場合、選択した場所に挿入する。 destIndex++; // その場所に挿入する。 ListViewItem newItem = this.listView1.Items.Insert(destIndex, srcItem.Text); newItem.Selected = true; this.listView1.Items.Remove(srcItem); } } private void Project_Load(object sender, EventArgs e) { string[] item1 = { "test1", "test1" }; string[] item2 = { "test2", "test2" }; string[] item3 = { "test3", "test3" }; string[] item4 = { "test4", "test4" }; string[] item5 = { "test5", "test5" }; listView1.Items.Add(new ListViewItem(item1)); listView1.Items.Add(new ListViewItem(item2)); listView1.Items.Add(new ListViewItem(item3)); listView1.Items.Add(new ListViewItem(item4)); listView1.Items.Add(new ListViewItem(item5)); }
Zuishin

2017/03/09 08:11

Drag_Drop 内の「その場に挿入する」のところを次のように書き換えてください。 具体的には、一行入れるだけですが、誤解のないように三行書きます。 ListViewItem newItem = this.listView1.Items.Insert(destIndex, srcItem.Text); newItem.SubItems.AddRange(srcItem.SubItems.OfType<ListViewItem.ListViewSubItem>().ToArray()); newItem.Selected = true;
Zuishin

2017/03/09 08:29

ああ、これは失敗しました。では次のようにしてください。 newItem.SubItems.AddRange(srcItem.SubItems.OfType<ListViewItem.ListViewSubItem>().Skip(1).ToArray());
happy0x0

2017/03/09 08:33

有難うございます!正常に動作致しました! もう1点なのですが、現在1つめ(左)のアイテムをD&Dしていますが、 二つ目(右)のアイテムをD&Dに対応する方法は分かりますでしょうか。
Zuishin

2017/03/09 08:38

ListView.FullRowSelect ではダメですか?
happy0x0

2017/03/09 08:52

有難うございます!こんなプロパティがあったんですね。 勉強になりました。 長々とお聞きしてしまい回答本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問