DOBON.NET DOBON.NETプログラミング掲示板過去ログ

異なる項目数のD&D

環境/言語:[windows2000]
分類:[.NET]

お世話になっています。
早速ですが、リストビュー1には
With lvLIST1
.Clear()
.Columns.Add("項目1", 40, HorizontalAlignment.Left)
.Columns.Add("項目2", 40, HorizontalAlignment.Left)
.Columns.Add("項目3", 50, HorizontalAlignment.Left)
.Columns.Add("項目4", 40, HorizontalAlignment.Left)
.Columns.Add("項目5", 200, HorizontalAlignment.Left)
End With
・・・という項目があり

リストビュー2には
With lvLIST2
.Clear()
.Columns.Add("項目5", 40, HorizontalAlignment.Left)
.Columns.Add("項目1", 40, HorizontalAlignment.Left)
.Columns.Add("項目3", 50, HorizontalAlignment.Left)
End With
があります。

リストビュー1からリストビュー2へD&Dすると、リストビュー1の項目1がリストビュー2の項目5に、項目2が項目1にドロップしますよね。
   そこでドロップする際にどの項目がどの項目へドロップするかを指定することってできるのでしょうか?
D&Dには以下のようなコードを使っています
Dim lvItem As ListViewItem
Dim destItem As ListViewItem
Dim destLv As ListView = CType(sender, ListView)
Dim clX As Integer = destLv.PointToClient(New Point(e.X, e.Y)).X
Dim clY As Integer = destLv.PointToClient(New Point(e.X, e.Y)).Y

Dim p As Point = destLv.PointToClient(New Point(e.X, e.Y))
Dim itm As ListViewItem = destLv.GetItemAt(p.X, p.Y)

If e.Data.GetDataPresent("System.Windows.Forms.ListViewItem", False) Then

lvItem = CType(e.Data.GetData("System.Windows.Forms.ListViewItem"), ListViewItem)
destItem = CType(sender, ListView).GetItemAt(clX, clY)

If itm Is Nothing Then
destLv.Items.Add(lvItem.Clone)
Else
destLv.Items.Insert(destItem.Index, lvItem.Clone)
End If

lvItem.Remove()
End If

ご教授お願いします。
一連の投稿を総合で見ると心配することがあります。
それは、実行した「結果」がOKだから「解決」で、実行しているコードを理解されていないのでは
ということです。
であれば、一つ一つのステートメントの動作を理解してくださいね。

> リストビュー1からリストビュー2へD&Dすると、リストビュー1の項目1がリストビュー2の項目5に、項目2が項目1にドロップしますよね。

これはそうしているからそうなるんです。
つまりコードでリストに追加しているわけでWindowsなりが勝手におこなっているのではありません。

>    そこでドロップする際にどの項目がどの項目へドロップするかを指定することってできるのでしょうか?

これもD&Dとは関係がありません。
今ListView1に何行かデータが表示されていると思います。
ある行のデータが左からA,B,C,D,Eとするなら、なぜ項目1にAが、なぜ項目2にBが表示されているかを理解してください。
ListViewItem、ListViewSubItemについて調べてみましょう。
■No14883に返信(まどかさんの記事)
> 一連の投稿を総合で見ると心配することがあります。
> それは、実行した「結果」がOKだから「解決」で、実行しているコードを理解されていないのでは
> ということです。
> であれば、一つ一つのステートメントの動作を理解してくださいね。

了解しました。m(_ _)m

> ListViewItem、ListViewSubItemについて調べてみましょう。

貴重なご教授、ありがとうございました。

destLv.Items.Add(lvItem.SubItems(2).Text).SubItems.Add(lvItem.SubItems(3).Text)で解決しました。lvItem.Cloneで項目を丸ごと持っていってたのですね?

本当にありがとうございました。
解決済み!
#見てもらえるかな。。。

> destLv.Items.Add(lvItem.SubItems(2).Text).SubItems.Add(lvItem.SubItems(3).Text)

これ、前提の前提であまりいい書き方ではありません。
可読性が低下します。

複数行になりますが、新しく作成されるオブジェクトを一つ一つ切り離しましょう。

Dim DropItem As ListViewItem

DropItem = New ListViewItem(lvItem.SubItems(2).Text)
DropItem.SubItems.Add(lvItem.SubItems(3).Text)
destLv.Items.Add(DropItem)
解決済み!
  • 題名: Re[4]: 異なる項目数のD&D
  • 著者: Ash
  • 日時: 2006/02/08 19:24:46
  • ID: 14946
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No14931に返信(まどかさんの記事)
> #見てもらえるかな。。。
>

> 複数行になりますが、新しく作成されるオブジェクトを一つ一つ切り離しましょう。
>
> Dim DropItem As ListViewItem
>
> DropItem = New ListViewItem(lvItem.SubItems(2).Text)
> DropItem.SubItems.Add(lvItem.SubItems(3).Text)
> destLv.Items.Add(DropItem)
>
そうですね、この方が後の編集や項目の追加等も断然やりやすいですね!!
ありがとうございます!

DropItem = New ListViewItem(lvItem.SubItems(2).Text)
DropItem.SubItems.Add(lvItem.SubItems(3).Text)
DropItem.SubItems.Add(lvItem.SubItems(1).Text)
DropItem.SubItems.Add(lvItem.SubItems(5).Text)
DropItem.SubItems.Add(・・・
destLv.Items.Add(DropItem)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板