【问题标题】:Listview Right-Click Drag After Left-Click Drag Removes Item左键拖动删除项目后Listview右键单击拖动
【发布时间】:2016-04-25 13:00:50
【问题描述】:

这是场景:

  1. 使用鼠标左键,将列表视图(详细信息视图)中的项目拖到放置目标上。一切都很好。
  2. 使用鼠标右键执行相同的操作。一切都很好,表明行为与鼠标左键相同。
  3. 使用鼠标左键,将一个项目从 Listview 拖到一个放置目标上,目标从 Listview 中删除拖动的项目。一切正常 - 项目已移除。
  4. 重复 #3。一切都很好——项目被移除,表明后续项目可以成功拖动,无需任何其他鼠标手势。
  5. 使用鼠标右键,重复#3。一切都不好——拖拽动作从未开始。
  6. 使用鼠标左键单击列表视图中的项目并释放它。
  7. 使用鼠标右键,将项目拖动到放置目标。一切都很好!

总而言之,使用鼠标左键或右键从 Listview 拖动的项目的工作方式相同。但是,一旦放置目标从 Listview 中删除了一个项目(即使它是被拖动的项目也无关紧要),鼠标右键拖动将停止工作,直到使用鼠标左键单击 Listview 项目。

这是预期的行为吗?如果是,为什么?有没有一种解决方法,让我可以让鼠标左键和右键都一样工作?

以下是相关代码:

Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
    ListView1.DoDragDrop(ListView1.SelectedItems.Item(0), DragDropEffects.Link)
End Sub

Private Sub TextBox1_DragDrop(sender As Object, e As DragEventArgs) Handles TextBox1.DragDrop
    Dim item As ListViewItem = e.Data.GetData(GetType(ListViewItem))
    If rbRemove.Checked Then
        Dim index As Int32 = ListView1.SelectedIndices.Item(0)
        For i As Int32 = 0 To ListView1.Items.Count - 1
            Dim item1 As ListViewItem = ListView1.Items(i)
            If item1 Is item Then
                ListView1.Items.RemoveAt(i)
                Exit For
            End If
            If index >= ListView1.Items.Count Then
                index -= 1
            End If
            ListView1.Items(index).Selected = True
        Next
    End If
End Sub

Private Sub TextBox1_DragOver(sender As Object, e As DragEventArgs) Handles TextBox1.DragOver
    e.Effect = DragDropEffects.Link
End Sub

【问题讨论】:

  • 这不是 AFAIK 的预期行为。听起来像一个错误……你能给我们看一些示例代码吗?
  • 好的,刚刚添加到原帖中。

标签: vb.net listview


【解决方案1】:

我不想这样做,但这似乎是一种解决方法:

Private activeDrag As Boolean
Private Sub ListView1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView1.MouseMove
    If (Not activeDrag) AndAlso (e.Button = Windows.Forms.MouseButtons.Right) AndAlso (Me.ListView1.SelectedItems.Count > 0) Then
        Dim x As ItemDragEventArgs = New ItemDragEventArgs(e.Button, Me.ListView1.SelectedItems.Item(0))
        Me.ListView1_ItemDrag(Me, x)
    End If

End Sub

activeDrag 变量在调用 DoDragDrop 之前设置为 true,然后在返回时设置为 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多