ListView:通过鼠标拖动多选项目

2024-04-25

In ListView, I can press Ctrl + Shift and click on the item to select. But, I want to drag the mouse to select the items (like DataGridView). I tried this code (below) and I had a problem like this:

My code:

Private mouseDownLV As Boolean

Private Sub ListView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseDown
    mouseDownLV = True
End Sub

Private Sub ListView1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove
    If mouseDownLV Then
        Try
            Dim i = ListView1.HitTest(e.Location).Item.Index
            ListView1.Items(i).Selected = True
        Catch ' ex As Exception
        End Try
    End If
End Sub

Private Sub ListView1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
    mouseDownLV = False
End Sub

实际上你需要遍历当前显示的ListViewItem物体和toggle the Selected与鼠标移动相交的项目的属性。这是实现这一目标的方法:

声明一个名为的类成员startPoint:

Private startPoint As Point

处理MouseDown设置起始位置的事件:

Private Sub ListView1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView1.MouseDown
    Dim s = DirectCast(sender, ListView)

    If e.Button = MouseButtons.Left AndAlso
        s.Items.Count > 1 Then
        startPoint = e.Location
    End If
End Sub

处理MouseMove事件至toggle the Selected财产:

Private Sub ListView1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView1.MouseMove
    Dim s = DirectCast(sender, ListView)

    If e.Button = MouseButtons.Left AndAlso s.Items.Count > 1 Then
        Dim selRect As New Rectangle(Math.Min(startPoint.X, e.Location.X),
                                    Math.Min(startPoint.Y, e.Location.Y),
                                    Math.Abs(e.Location.X - startPoint.X),
                                    Math.Abs(e.Location.Y - startPoint.Y))

        Dim cr = s.ClientRectangle

        'Toggle selection...
        For Each item In s.Items.Cast(Of ListViewItem).
            Where(Function(x) x.Bounds.IntersectsWith(cr))
            item.Selected = selRect.IntersectsWith(item.Bounds)
        Next
    End If
End Sub

一个快速演示来检查:

但是,如果您有许多项目,而客户区域的大小不足以显示所有项目,因此垂直滚动条可见,该怎么办?你会得到这样的东西:

正如您所看到的,垂直滚动条不会移动,您将无法继续选择/取消选择隐藏的项目。为了解决这个问题,我们需要更多代码:

导入签名获取滚动位置 https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getscrollpos在你的班级中的某个地方运行:

Imports System.Runtime.InteropServices
'...

<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Private Shared Function GetScrollPos(hWnd As IntPtr,
                                    nBar As Orientation) As Integer
End Function

Note: Passing a System.Windows.Forms.Orientation value instead of an Interger.

改变MouseDown活动至:

Private Sub ListView1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView1.MouseDown
    Dim s = DirectCast(sender, ListView)

    If e.Button = MouseButtons.Left AndAlso
    s.Items.Count > 1 Then
        Dim vsp = GetScrollPos(s.Handle, Orientation.Vertical)
        Dim yOffset = s.Font.Height * vsp

        startPoint = New Point(e.X, e.Y + yOffset)
    End If
End Sub

And the MouseMove活动至:

Private Sub ListView1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListView1.MouseMove
    Dim s = DirectCast(sender, ListView)

    If e.Button = MouseButtons.Left AndAlso s.Items.Count > 1 Then
        Dim vsp = GetScrollPos(s.Handle, Orientation.Vertical)
        Dim yOffset = s.Font.Height * vsp

        Dim selRect As New Rectangle(Math.Min(startPoint.X, e.Location.X),
                                    Math.Min(startPoint.Y - yOffset, e.Location.Y),
                                    Math.Abs(e.Location.X - startPoint.X),
                                    Math.Abs(e.Location.Y - startPoint.Y + yOffset))

        Dim cr = s.ClientRectangle

        'Toggle selection...
        For Each item In s.Items.Cast(Of ListViewItem).
            Where(Function(x) x.Bounds.IntersectsWith(cr))
            item.Selected = selRect.IntersectsWith(item.Bounds)
        Next

        'Scroll if needed...
        Dim p = s.PointToClient(Cursor.Position)
        Dim lvi = s.GetItemAt(p.X, p.Y)

        If lvi Is Nothing Then Return

        Dim fh = s.Font.Height

        If lvi.Index > 0 AndAlso (p.Y - lvi.Bounds.Height * 1.5) <= fh Then
            s.Items(lvi.Index - 1).EnsureVisible()
        ElseIf lvi.Index < s.Items.Count - 1 AndAlso
            (p.Y + lvi.Bounds.Height * 1.5) > (s.Height - fh) Then
            s.Items(lvi.Index + 1).EnsureVisible()
        End If
    End If
End Sub

结果是:

Here https://pastebin.com/vwnTUwByVB.NET 自定义 ListView 控件解决了这个问题,并且another https://pastebin.com/9TzmmfEJ in C#.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListView:通过鼠标拖动多选项目 的相关文章

  • 如何使用listview.GetItemAtPosition(e.Position)获取用户点击的ListView项目的数据?

    在 Xamarin Android 应用程序中 我有一个之前填充的 ListView 在正确触发的 listview ItemClick 事件处理程序中 我想检索单击的 listview item 视图的文本 以便在 AlertDialog
  • VB.NET 使用 system.net.tcpclient 编写 telnet 客户端

    当我连接到我的Solaris盒子时这对我不起作用 服务器正在回传 有谁知道我做错了什么 Imports System Net Imports System Net Sockets Imports System Text Public Cla
  • 如何用VB.net生成pdf文件?

    我想生成一个非常简单的报告 其中包含一些图像和文本 我想知道是否有一种方法可以使用 vb net 生成 pdf 文件 您可以使用 Visual Studio 附带的 Crystal Reports 对象导出到 PDF 文件
  • 使用文本框搜索 datagridview 中的列 (vb.net)

    如何使用文本框搜索 datagridview 中的列 我正在使用 vb net 2010 我有一个带有数据源的 Datagridview 下面是我用于填充 datagridview 的代码 网格视图将有 4 列 Private Sub Lo
  • MVVMCross 在 MvxBindableListView 中更改 ViewModel

    我的 Android 应用程序出现了一些小问题 我不知道如何使用 MVVM Cross 来解决它 这是我的模型 public class Article string Label get set string Remark get set
  • 如何将 System.Windows.Forms 添加到我的 .NET 5.0 项目中?

    对于我缺乏术语和理解 我提前表示歉意 我对 NET 和 Visual Studio 非常陌生 我在 Windows 7 64 位上的 Visual Studio Community 2019 版本 16 10 4 中使用 Visual Ba
  • C# vb:S​​ystem.Func 占用多少内存?

    System Func 究竟拥有多少内存 System Func 是 1 行还是 1000 行有什么区别吗 Func是委托类型 一个实例在x86抖动中占用32字节存储 对象头 8 个字节 4 个字节用于 Delegate methodBas
  • 如何从网络客户端获取状态码?

    我正在使用WebClient类将一些数据发布到 Web 表单 我想获取表单提交的响应状态代码 到目前为止我已经找到了如果出现异常如何获取状态代码 Catch wex As WebException If TypeOf wex Respons
  • 无法设置 PageSetup 类的 PaperSize 属性

    我正在尝试使用 VB NET 打印 Excel 电子表格 但出现错误 无法设置 PageSetup 类的 PaperSize 属性 这是我的代码 Dim oldCI As System Globalization CultureInfo S
  • 将列表视图项转换为单个位图图像

    参考这个主题 Android 获取所有 ListView 项目的屏幕截图 https stackoverflow com questions 12742343 android get screenshot of all listview i
  • 位置 0 处没有行

    cmd CommandText select from product where prod code Trim txtprod code Text and branch w location and avail stock lt gt 0
  • 如何检查数据行中是否存在具有给定名称的列

    我想从数据行中的循环插入一个值 因此在数据行中输入值之前 我想检查表中是否存在特定列名称 请告诉我如何检查 首选 vb net 我得到了答案 并且它正在工作 它是 If dr Table Columns Contains columnnam
  • ASP.NET 列表视图->单击行->执行操作

    我需要以下方面的帮助 我有一个用隐藏代码填充的列表视图 Linq gt Sql ListView1 DataSource from x in database ITEMS select x ListView1 DataBind 项目内容 I
  • 为什么文件传输完成后我的列表视图条目的内容没有更新?

    为什么将文件复制到目录后listview没有更新驻留在该目录中的较新内容 仅当我退出时listview重新进入视图会刷新吗 有人可以告诉我如何解决这个问题吗 文件功能java文件的复制 您应该将新复制的文件 VideoInfo对象 添加到您
  • 如何仅在某些列中设置带有复选框的 TListView?

    我正在使用 Delphi 2010 并且我试图允许用户在 TListView 中的每行 2 个选项之间进行选择 使用 TListView 我可以将样式设置为 vsReport 并启用复选框 但这只会让我每行有 1 个复选框 我需要的是每行
  • 按降序对数字进行排序

    我有 20 个文本框 每个都包含一个特定的数字 我希望 textbox1 到 textboxN 的数字按降序排列 如果任何文本框的值为零 那么我想保留该文本框不变 需要 vb net 中的示例代码 用于按降序对元素进行排序 dim arra
  • Razor 视图中的内联 If

    在我的控制器中 我有内联 If 语句 ViewBag NameSortParam If String IsNullOrEmpty sortOrder Name desc 在我看来 如果出现以下情况 我似乎无法使用内联 Code If Tru
  • 如何允许用户对列表中的项目重新排序?

    我有一个 Android 应用程序 用户可以在其中将项目添加到列表中 并且我希望他们能够按照自己的意愿对列表中的项目进行重新排序 而不是仅仅向他们提供不同的排序顺序 为项目添加位置设置 它们来自数据库 很容易 但是用户可以使用哪种 UI 元
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性

随机推荐

  • 如何为一系列任务设计执行引擎

    我正在尝试用 Java 编写一个问题 我必须执行一堆任务 Problem 执行由多个任务组成的作业 并且这些任务之间具有依赖关系 一个作业将有一个任务列表 每个这样的任务将进一步有一个后续任务列表 每个后续任务将有自己的后续任务 您可以在此
  • _ftol2_sse,有更快的选择吗?

    我有调用很多的代码 int myNumber int floatNumber 这总共占用了我大约 10 的 CPU 时间 根据分析器 虽然我可以就这样 但我想知道是否有更快的选择 所以我尝试四处搜索 并偶然发现 http devmaster
  • 如何使用jquery从字符串中获取第一个字母[重复]

    这个问题在这里已经有答案了 我对 jquery 的了解很差 我已经提到了下面的脚本 var header time col text alert header 我从如何获取第一个字母 例如 1 中得到了字符串 109 00AM 请你帮助我好
  • 无法从字符串中删除“\r\n”

    我有一个像这样的字符串 la lala 135 1039 921 r n 而且我无法删除 r n 最初这个字符串是一个字节对象 但后来我将它转换为字符串 我尝试过 strip r n 与 replace r n 但什么也没有 gt gt g
  • 为什么 HTTP 请求在 Chrome 中陷入挂起状态?

    语言 工具版本 角度 cli 1 2 0 PHP 7 0 8 Zend 表达 2 阿帕奇2 4 23 铬65 0 3325 181 Windows 7的 Issue 我有一个 Angular2 应用程序 它使用 PHP 应用程序作为所有 X
  • java以一种方式绘制矩形而不是同时使用两种方式

    你好 我在java中有一些代码可以绘制一个矩形 但是它只会向右拖动 即使我向左拖动它也会向右拖动 这是代码我有什么帮助吗 public void mouseDragged MouseEvent e Point p e getPoint in
  • 同时使用 POST 和 GET 的 HttpWebRequest

    我需要将用户重定向到http www someurl com id 2 http www someurl com id 2使用 POST 方法 是否可以 如果是 那么如何 现在我有以下内容 它正确转发 POST 数据 但它删除了 id 2
  • 如何在级联下拉列表中显示选定的值?

    我想要为编辑视图中的选定值扩展以下代码 以国家 gt 州 gt 城市为例 我有脚本 Cascading DropDown List js function bindDropDownList e targetDropDownList var
  • 如何在Windows服务程序中捕获SERVICE_CONTROL_SHUTDOWN代码

    我最近正在编写一个Windows服务程序 我在编程时遇到的问题是 当我在 Windows 操作系统上安装程序时 它无法正常关闭 关闭系统需要很长时间 看来我的程序是问题的原因 我试图在互联网上找到解决方案 我发现在我的代码中添加 SERVI
  • FF 和 IE 不从 CSS 加载 img src

    我正在使用这样的 css 设置图像的 src Banner content url Banners prussia awesomeness gif width 1000px 这是我的图片 div class Header img src a
  • 视频无法以全屏模式播放

    当我尝试在全屏浏览中播放嵌入视频时 出现 NPE 它在 3 0 蜂窝中运行良好 但在 ICS 4 0 中运行不佳 知道如何解决这个问题吗 java lang NullPointerException at android webkit Pl
  • php codeigniter 中的 concat

    请帮助我理解正确的连接语法 我有一个名为存货其中有 trans id trans items items gt item id trans user employees gt person id trans date trans comme
  • boost::mpi 和 boost:serialization with std::variant

    c 17引入了新类型std variant 是否可以定义一个序列化例程 以便使用std variant和这个结合boost mpi 例如 考虑一个简单的程序 include
  • 如何从网址下载所有文件?

    我想从 URL 获取所有文件 文件可能有不同类型的扩展名 如何从网站 URL 获取带有 webclient 对象的所有文件 当我打开网站网址时 文件列出如下格式 框架 js 我的文件 png Class1 cs 来自 Web URL 的文件
  • iOS 将 URL 中的音频分成帧

    我正在 iOS 上开发一个简单的网络广播应用程序 具有非常简单的语音 音乐识别功能 主要思想是一个收音机 它播放来自 url 的信号 同时检查正在广播的信号类型 当它检测到语音时 它会改变频道等等 我使用 Storyboards 和 AVF
  • PHP 上的多个 TCP 套接字请求

    是否可以使用 PHP 上的套接字服务器接受多个请求 并行 如果可以的话 怎样做 普通的 PHP 脚本无法接收多个请求 但如果你真的计划创建一个套接字服务器 作为 cmdline php 脚本启动 那么是的 这是可能的 调查http pear
  • 使用 Json.Net 自定义 DateTime 序列化

    我尝试创建自定义日期时间转换器失败 问题 我有许多对象要序列化 其中一些包含 DateTime 的属性 其中包含 DateTime MinValue 我想将其序列化为空 但是我发现的所有解决方案都要求装饰对象内部的正确位置 我做不到 我在下
  • Linq“等于”关键字

    LINQ 中的 equals 关键字是否会检查左侧和右侧的对象是否指向同一对象 记忆或检查其内容 它比较了values 另请参阅Linq 连接中 和 equals 有什么区别 https stackoverflow com question
  • RuntimeError:使用 docker 关闭连接后无法重用套接字

    我正在关注本教程 https github com getamis eth indexer blob master README md fbclid IwAR3g3SAjJ9ik hHCFkol2k8YXo0GvBL15oSNC hIU38
  • ListView:通过鼠标拖动多选项目

    In ListView I can press Ctrl Shift and click on the item to select But I want to drag the mouse to select the items like