[求助]datagridview 鼠标左键单击实现Ctrl+鼠标左键的功能(多条选择)

困困 2008-06-28 07:09:42
现在在vb2008(vb2005也一样)中有个datagridview,
设置成允许多条选择的模式,
现在想每次鼠标左键单击就可以像按住Ctrl加鼠标左键那样的增加选择的条数.

比如:
现在datagridview中有5条记录,
正常情况下我想选择前三条的话,必须:
a.要按住Ctrl,同时鼠标左键依次单击第一条到第三条.
b.(或者)按住鼠标左键,从第一条拖拽到第三条.

我想要的是:
1.不用按住Ctrl,只是鼠标左键依次单击第一条到第三条就可以实现前三条都被选择.(对同一条再次点击就可以取消选择当前条) 60'
2.屏蔽鼠标拖拽的功能.(主要是我现在另外加了两个button用来控制datagridview的分页显示,但是鼠标拖拽时能使数据自动上移,分页部分就乱了) 40'


不知道问题有没有表达清楚.
编程经验不足,惭愧,希望各路高手指点一二...

...全文
1532 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pinpinpang 2011-10-08
  • 打赏
  • 举报
回复
先谢谢各位了
pinpinpang 2011-10-08
  • 打赏
  • 举报
回复
WPF中 如何使用代码实现Ctrl键+鼠标左键多选功能
困困 2008-07-04
  • 打赏
  • 举报
回复
貌似第2个问题也只有用楼上(gyc)的方法了。

先结贴了,
谢谢楼上各位。
gyc 2008-07-02
  • 打赏
  • 举报
回复
恩, 知道楼主要做什么了

楼组是想禁止 自动滚动

我也找了一下, 没有找到

源代码方面没有看

关闭多选的话,就不会有那个效果了, 不过这个 和你说的 也不一样

现在想到的临时方法,也就是分页了,只加载 屏幕可以显示的数据
困困 2008-06-30
  • 打赏
  • 举报
回复
关于10楼的代码补充一点:
"CheckFlag"不能是隐藏列(隐藏列的时候CellPainting事件不响应。)

回yanlongwuhui炎龙无悔:
你对第一个问题的回答我试了,果真好用,我在DataGridView的CellMouseEnter事件中加入你给的“按下CTRL”,在CellMouseLeave事件中加入“释放CTRL”,比较理想,比我在10楼的代码应该要好用些(因为CellPainting时画面有闪动)。


回14楼的gyc:
第2个问题我设置的确实是行选择模式“Me.dgvPerson.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect”

貌似我这第二个问题没说清楚。
我现在设的是行选择+多选(multiSelect=true)。
在DataGridView中按住鼠标拖动,可以实现多选;并且如果此时DataGridView中的数据多于画面上能够显示的条数的话,一直拖动鼠标可以使下面本来没显示的数据串上来〈--我想禁止这个功能,该怎么做。
gyc 2008-06-30
  • 打赏
  • 举报
回复
1、 你可以试试,在单击的时候 自动发送一个 Ctrl 按键

2、如果你只处理 选择行, 可以 设置DGV 的选择模式为 Row, 而不是Cell
这样话,单击一个行的任意地方,都会选择整行
lingxyd_0 2008-06-30
  • 打赏
  • 举报
回复

对于键盘事件方面的知识不是太了解。

帮忙顶起来!!!!
困困 2008-06-30
  • 打赏
  • 举报
回复
回yanlongwuhui炎龙无悔,
谢谢你对第一个问题的回答,我才看到,一会儿试试。
困困 2008-06-30
  • 打赏
  • 举报
回复
关于第二个问题:
按住鼠标左键,还是可以上下滚动数据。郁闷ing.
困困 2008-06-30
  • 打赏
  • 举报
回复
关于第一个问题:
用了2楼yuelailiu的方法,基本可行,

方法共享如下(加了CellMouseClick和CellPainting两个事件,并且在“dgvPerson”中加了一个名为"CheckFlag"的隐藏checkbox列,clsCommon.NVL(value,type)函数作用就是强制类型转换):

''' <summary>
''' セルのマウスクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks>vb2008 by liny</remarks>
Private Sub dgvPerson_CellMouseClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvPerson.CellMouseClick
Try
If e.RowIndex = -1 OrElse e.ColumnIndex = -1 Then
Return
End If

If clsCommon.NVL(Me.dgvPerson.Rows(e.RowIndex).Cells("CheckFlag").Value, 0I) = 0 Then
Me.dgvPerson.Rows(e.RowIndex).Cells("CheckFlag").Value = 1
Else
Me.dgvPerson.Rows(e.RowIndex).Cells("CheckFlag").Value = 0
End If


Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, Me.Text)
End Try
End Sub

''' <summary>
''' セルを描画する
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks>vb2008 by liny</remarks>
Private Sub dgvPerson_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgvPerson.CellPainting
Try
If e.RowIndex = -1 OrElse "CheckFlag".Equals(Me.dgvPerson.Columns(e.ColumnIndex).Name) = False Then
Return
End If

If clsCommon.NVL(Me.dgvPerson.Rows(e.RowIndex).Cells("CheckFlag").Value, 0I) = 0 Then
Me.dgvPerson.Rows(e.RowIndex).Selected = False
Else
Me.dgvPerson.Rows(e.RowIndex).Selected = True
End If


Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, Me.Text)
End Try
End Sub
yanlongwuhui 2008-06-30
  • 打赏
  • 举报
回复
参考如下:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Const KEYEVENTF_KEYUP = &H2

按下CTRL:keybd_event(Keys.ControlKey, 0, 0, 0)
释放CTRL:keybd_event(Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0)

只是个查询窗体的话,可以在LOAD事件中按下CTRL,在CLOSED事件中释放CTRL。如果有输入,具体要怎么控制你自己试,要注意按下和释放要对应。
神之泪花 2008-06-30
  • 打赏
  • 举报
回复
路过,关注....
困困 2008-06-30
  • 打赏
  • 举报
回复
不知道3楼说的发送鼠标消息是不是指的SendKeys,
我上网查了一下,发现SendKeys只能发送键盘消息.....

2.我在datagridview的属性中没有找到控制 鼠标拖拽 的属性.我现在datagridview中以“allow”开头的属性都设置成false了,但是运行后鼠标一拖动还是可以选择多条。
困困 2008-06-30
  • 打赏
  • 举报
回复
up
困困 2008-06-29
  • 打赏
  • 举报
回复
感谢楼上3位的回答,但是能不能说的再详细一点,
补充两点:
1.我做的win form 的应用程序.
2.上面第二个问题中的"鼠标拖拽"指的是 按住鼠标左键向下(上)一拖,就会选择一片,如果使劲向下拖,就会使下面那么本来没显示的数据显示出来<---这个功能怎么屏蔽(比如keydown事件中不是有个e.handle=true,就可以使keydown无效嘛,有没有类似这样的?)

关于2,3楼的回答:
>发送鼠标消息,你可以发送ctrl和鼠标左键的消息,然后处理
发送这个消息的代码是什么?然后处理什么?是不是还要使本身的鼠标左键单击无效?怎么弄?

>鼠标拖拽应该通过设置拖拽属性实现
印象中datagridview好象是有个属性是控制拖拽,等我周一上班后试试是不是我想要的那种(现在试不了...).
楼上说的代码实现是怎么实现的?

足球中国 2008-06-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 CathySun118 的回复:]
1.不用按住Ctrl,只是鼠标左键依次单击第一条到第三条就可以实现前三条都被选择.(对同一条再次点击就可以取消选择当前条) 60'
发送鼠标消息,你可以发送ctrl和鼠标左键的消息,然后处理
2.屏蔽鼠标拖拽的功能.(主要是我现在另外加了两个button用来控制datagridview的分页显示,但是鼠标拖拽时能使数据自动上移,分页部分就乱了) 40'
鼠标拖拽应该通过设置拖拽属性实现


用代码实现。
[/Quote]
CathySun118 2008-06-28
  • 打赏
  • 举报
回复
1.不用按住Ctrl,只是鼠标左键依次单击第一条到第三条就可以实现前三条都被选择.(对同一条再次点击就可以取消选择当前条) 60'
发送鼠标消息,你可以发送ctrl和鼠标左键的消息,然后处理
2.屏蔽鼠标拖拽的功能.(主要是我现在另外加了两个button用来控制datagridview的分页显示,但是鼠标拖拽时能使数据自动上移,分页部分就乱了) 40'
鼠标拖拽应该通过设置拖拽属性实现
yuelailiu 2008-06-28
  • 打赏
  • 举报
回复
1 在datagridview 追加一个 checkbox,多选框,实现多选即可。

2 通过google 搜索 datagridview 分页
困困 2008-06-28
  • 打赏
  • 举报
回复
先谢过....

16,552

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧