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

ListView_DragDropについて

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

お世話になっています。
ListViewからListViewへドラッグしたときに、ドロップされた側に項目があればすきな場所にInsertされるのですが・・・項目のない位置にドロップされた時はリストの最尾に項目が追加されるようにするにはどう書けばよいのでしょうか?
実は、このコードほかのサンプルコードをコピパしただけなのですが、以下のとおりです。

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


If e.Data.GetDataPresent("System.Windows.Forms.ListViewItem", False) Then
destItem = CType(sender, ListView).GetItemAt(clX, clY)

lvItem = CType(e.Data.GetData
"System.Windows.Forms.ListViewItem"), ListViewItem)


destLv.Items.Insert(destItem.Index, lvItem.Clone)
  lvItem.Remove()

End If
2006/02/03(Fri) 11:27:57 編集(投稿者)

お世話になります。

■No14829に返信(Ashさんの記事)
宇宙仮面さんの http://ukamen.hp.infoseek.co.jp/Programming1/DragAndDrop/#SEC7
を参考に書いてみました。
(Form1 には ListView1 と ListView2 が配置してあります)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
  With Me.ListView1
    .View = View.List
    .AllowDrop = True
    .MultiSelect = False
    .Columns.Add("aaa", 100, HorizontalAlignment.Left)
    .Items.Add(New ListViewItem(New String() {"aaa"}))
    .Items.Add(New ListViewItem(New String() {"bbb"}))
    .Items.Add(New ListViewItem(New String() {"ccc"}))
    .Items.Add(New ListViewItem(New String() {"ddd"}))
  End With
  With Me.ListView2
    .View = View.List
    .AllowDrop = True
    .MultiSelect = False
    .Columns.Add("111", 100, HorizontalAlignment.Left)
    .Items.Add(New ListViewItem(New String() {"111"}))
    .Items.Add(New ListViewItem(New String() {"222"}))
    .Items.Add(New ListViewItem(New String() {"333"}))
    .Items.Add(New ListViewItem(New String() {"444"}))
  End With
End Sub

Private Sub ListView1_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView1.ItemDrag
  Me.ListView1.DoDragDrop(e.Item, DragDropEffects.Copy)
End Sub

Private Sub ListView1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragEnter
  e.Effect = DragDropEffects.Copy
End Sub

Private Sub ListView2_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView2.DragEnter
  e.Effect = DragDropEffects.Copy
End Sub

Private Sub ListView2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView2.DragDrop
  If e.Data.GetDataPresent(GetType(ListViewItem)) Then
    Dim srcItem As ListViewItem = DirectCast(e.Data.GetData(GetType(ListViewItem)), ListViewItem)
    Dim p As Point = Me.ListView2.PointToClient(New Point(e.X, e.Y))
    Dim itm As ListViewItem = Me.ListView2.GetItemAt(p.X, p.Y)
    Dim destIndex As Integer = Me.ListView2.Items.IndexOf(itm)

    '存在しない場所を選択した場合
    If destIndex = -1 Then
      destIndex = Me.ListView2.Items.Count
    End If
    Dim newItem As ListViewItem = Me.ListView2.Items.Insert(destIndex, srcItem.Text)
    newItem.Selected = True
  End If
End Sub
>     Dim itm As ListViewItem = Me.ListView2.GetItemAt(p.X, p.Y)
>     Dim destIndex As Integer = Me.ListView2.Items.IndexOf(itm)
>
>     '存在しない場所を選択した場合
>     If destIndex = -1 Then
>       destIndex = Me.ListView2.Items.Count
>     End If

GetItemAtがそもそもNothingを返してくれるので、間接的なIf文になって個人的には気持ち悪いです。
#あとInsertで落ちますよね。。。

Dim newItem As ListViewItem
If itm Is Nothing Then
newItem = Me.ListView2.Items.Add(srcItem.Text)
Else
destIndex = itm.Index
newItem = Me.ListView2.Items.Insert(destIndex, srcItem.Text)
End If
> #あとInsertで落ちますよね。。。

すいません。
落ちないですね。存在するインデックスが対象と勘違いしてました。m(_ _)m
なおこ(・∀・) さん、まどかさん。
ありがとうございます!
おかげで一週間分の悩みが吹っ飛びました(^^)・・・
解決済み!

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