C#ListView D&DでItemの移動方法
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 4,472
前提・実現したいこと
C#を用いてListViewのアイテムをドラッグアンドドロップで位置を移動したいです。
列1のItemをD&Dして列3に移動する等
その際に、サブアイテムも一緒に移動したいと考えています。
調べては見たものの、目的と同じものが見当たらず、質問させて頂きます。
こちらのサイトでリストボックスで似たような処理が書いてありました。
http://www.kisoplus.com/sample2/sub/listbox.html
こちらのリストボックスの処理をサブアイテムを含めたリストビューにて行いたいと考えています。
補足情報(言語/FW/ツール等のバージョンなど)
C# ビジュアルスタジオ2015 Windows Form Application
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
これはどうですか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/03/08 17:58
URL先の処理は一度試しているのですが、
うまく動作が出来ませんでした。
URL先はViewのスタイルがList型ので
サブアイテム含むDetails型で行っているのが関係しているのかなと。。
2017/03/08 18:04
この ListView というのは Explorer で使われている物そのものです。
Details 型かどうかは普通は関係ありません。
2017/03/09 16: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つ目のテキストが消えてしまいます。
複数同時に移動したいのですがどうしたらよいでしょうか…。
2017/03/09 16:51
2017/03/09 16: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));
}
2017/03/09 17:11
具体的には、一行入れるだけですが、誤解のないように三行書きます。
ListViewItem newItem = this.listView1.Items.Insert(destIndex, srcItem.Text);
newItem.SubItems.AddRange(srcItem.SubItems.OfType<ListViewItem.ListViewSubItem>().ToArray());
newItem.Selected = true;
2017/03/09 17:24 編集
https://gyazo.com/a9af7d29c6804fbaa5080e04e18ed1c7
2017/03/09 17:29
newItem.SubItems.AddRange(srcItem.SubItems.OfType<ListViewItem.ListViewSubItem>().Skip(1).ToArray());
2017/03/09 17:33
もう1点なのですが、現在1つめ(左)のアイテムをD&Dしていますが、
二つ目(右)のアイテムをD&Dに対応する方法は分かりますでしょうか。
2017/03/09 17:38
2017/03/09 17:52
勉強になりました。
長々とお聞きしてしまい回答本当に助かりました。