C#Listview拖放行

C#Listview拖放行,c#,listview,drag-and-drop,C#,Listview,Drag And Drop,我试图用listview实现一个C#拖放行重新排序,然后用当前的行顺序更新SQL数据库。我在互联网上遇到过一些代码片段(其中一个来自这个实现了“var”类的网站),但似乎没有一个能够满足我的需要。我不需要帮助更新数据库,因为我有一个很好的想法如何做到这一点,但似乎无法使行重新排序工作正常,任何输入将不胜感激 -谢谢 m&a我知道这不是特定于ListView的,但我有一些示例代码,用于实现从DataGridView拖放行。其中一些代码显然是特定于控件的,其他代码实际上是非常通用的(例如决定何时拖动

我试图用listview实现一个C#拖放行重新排序,然后用当前的行顺序更新SQL数据库。我在互联网上遇到过一些代码片段(其中一个来自这个实现了“var”类的网站),但似乎没有一个能够满足我的需要。我不需要帮助更新数据库,因为我有一个很好的想法如何做到这一点,但似乎无法使行重新排序工作正常,任何输入将不胜感激

-谢谢

m&a

我知道这不是特定于
ListView
的,但我有一些示例代码,用于实现从
DataGridView
拖放行。其中一些代码显然是特定于控件的,其他代码实际上是非常通用的(例如决定何时拖动):

完全忘记了
ListView
已经允许拖放的事实

我还可以添加一些理论-当控件上发生下降时,您需要在
列表视图
上的这些坐标上点击test(可能是一个名为
HitTest
)以查看点击了哪一行,这是插入被拖动行的基础

不相关-这类
var
可能是C#中新的
var
关键字吗

  • 确保
    AllowDragDrop
    设置为
    true

  • 至少为这3个事件实现处理程序

    private void myList_ItemDrag(object sender, ItemDragEventArgs e)
        {
            DoDragDrop(e.Item, DragDropEffects.Link);
        }
    
        private void myList_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Link;
        }
    
        private void myList_DragDrop(object sender, DragEventArgs e)
        {
            // do whatever you need to reorder the list.
        }
    
    获取您放置到的行的索引可能类似于:

    Point cp = myList.PointToClient(new Point(e.X, e.Y));
    ListViewItem dragToItem = myList.GetItemAt(cp.X, cp.Y);
    int dropIndex = dragToItem.Index;
    

  • 谢谢,看起来myList_DragDrop的方法需要一些修改。因此,据我所知,我们将不得不从列表中删除所选项目,然后将其重新添加到新索引中(我们想将其放到哪里?)。另外,我们还必须将放入的行向下移动1…是否有处理此问题的事件?嗨,ItemDrag方法将整个ListView控件传递到DragDrog方法,在该方法中,我无法获取开始拖动的特定项,有什么建议吗?私有void empList_ItemDrag(对象发送方,ItemDragEventArgs e){DoDragDrop(e.Item,dragdropefects.Link);empList.Items.RemoveAt(empList.selecteddinces[0])}私有void empList_DragDrop(对象发送方,DragEventArgs e){Point cp=empList.PointToClient(新点(e.X,e.Y));ListViewItem dragToItem=empList.GetItemAt(cp.X,cp.Y);int dropIndex=dragToItem.Index;}我问了一个类似的问题,关于如何找到正确的索引来插入项,看起来是相同的方法,但有一些错误:(-关于主题的好代码项目文章Hi Adam,我们认为ListView允许拖放,但是除了属性allowdrop=true之外,我们找不到任何自动逻辑来为我们移动行。这就是为什么它看起来像是用事件实现的(如上面的帖子)是必需的。当我们看到下面的帖子时,var属性受到了质疑:@Mike yea当我发现另一篇帖子时,我意识到了这一点,因此我划掉了答案的相关部分。我没有意识到的是ListView有一个GetItemAt方法——为您很好地封装了命中测试。使用它,所需要的只是删除该行并将其插入到给定的索引-1中。此外,在该帖子中还有新的var关键字-这意味着编译器会为您推断类型-语法糖。您好,ItemDrag方法将整个ListView控件传递到DragDrog方法中,在该方法中,我无法获取我已开始拖动的特定项,有什么建议吗?私有void empList_ItemDrag(对象发送方,ItemDragEventArgs e){DoDragDrop(e.Item,dragdropeffect.Link);empList.Items.RemoveAt(empList.selecteddinces[0])}私有void empList_DragDrop(对象发送方,DragEventArgs e){Point cp=empList.PointToClient(新点(e.X,e.Y));ListViewItem dragToItem=empList.getitem=empList(cp.X,cp.Y);int-dropIndex=dragToItem.Index;}我认为这条评论最好与Matthew Vines的答案相反。