WINFORM中,能样实现按住Ctrl,用鼠标点击DataGrid任何一行对DATAGRID多选?

supershagua 2005-03-11 02:04:58
WINFORM中,能样实现按住Ctrl,用鼠标点击DataGrid任何一行对DATAGRID多选?目前我只能做到点击行头才能实现。
...全文
306 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hamadou 2005-03-14
  • 打赏
  • 举报
回复
试过了。应该是这样的!
楼上正解!我也学习学习!
kissnono 2005-03-14
  • 打赏
  • 举报
回复
Public Class mYdATAGRID
Inherits DataGrid
Private m As New ArrayList

Public ReadOnly Property MultiSelectedIndex() As Integer()
Get
Return m.ToArray(GetType(Integer))
End Get
End Property

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
Dim posdg As Point = New Point(e.X, e.Y)
Dim hitDG As DataGrid.HitTestInfo = HitTest(posdg)
If HitDataGrid(hitDG) Then
MyBase.OnMouseDown(e)
End If
End Sub

Private Function HitDataGrid(ByVal Hit As DataGrid.HitTestInfo) As Boolean
Try
If Me.ModifierKeys = Keys.Control Then
If Hit.Row > -1 Then
If m.IndexOf(Hit.Row) > -1 Then
m.Remove(Hit.Row)
Me.UnSelect(Hit.Row)
Else
m.Add(Hit.Row)
Me.Select(Hit.Row)
End If
End If
Return False
Else
m.Clear()
If Hit.Type = DataGrid.HitTestType.RowHeader Then
m.Add(Hit.Row)
End If
Return True
End If
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Function
End Class
如果不符合要求的话,继续发贴
supershagua 2005-03-14
  • 打赏
  • 举报
回复
谢谢,kissnono,完全符合要求,也谢谢hamadou
supershagua 2005-03-13
  • 打赏
  • 举报
回复
自己up
lyj670 2005-03-13
  • 打赏
  • 举报
回复
up
supershagua 2005-03-12
  • 打赏
  • 举报
回复
hamadou(闵峰),我试过你的代码,但好像不能达到我的需求,我要求是按住ctrl后,点击datagrid的任何一个单元格都能实现每行目前行的多选,就像按住ctl后,点击rowHeader的效果一样。
supershagua 2005-03-12
  • 打赏
  • 举报
回复
up
hamadou 2005-03-12
  • 打赏
  • 举报
回复
现在是在datagrid里面,点击ctrl键时可以选中多行,但是有一个缺陷,就是当我们不按ctrl键,只是点击了一个cell后,应该把以前的记录都清楚掉,也就是说应该清除这里的m数组。但在这里没有实现,必须在按了其他的键后才可以清除,只是单击该cell时无法清除!希望能给你些帮助!
Dim m As New ArrayList()

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Sqldpr.Fill(D1.test1)
Me.Mydatagrid1.DataSource = D1.test1
Dim style As New DataGridTableStyle()
style.MappingName = "test1"
Dim c2 As New DataGridTextBoxColumn()
c2.MappingName = "id"
c2.HeaderText = "id列"
AddHandler c2.TextBox.KeyDown, AddressOf mykeydown
style.GridColumnStyles.Add(c2)
Dim c1 As New DataGridTextBoxColumn()
c1.MappingName = "name"
c1.HeaderText = "name"
style.GridColumnStyles.Add(c1)
Me.Mydatagrid1.TableStyles.Add(style)
End Sub

Private Sub mykeydown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
Dim i As Integer
Dim index As Integer = Mydatagrid1.CurrentRowIndex
If e.KeyValue = Keys.ControlKey Then
If m.Contains(index) Then
Mydatagrid1.UnSelect(index)
m.Remove(index)
Else
m.Add(index)
End If
For i = 0 To m.Count - 1
Mydatagrid1.Select(m(i))
Next

Else
'm.Clear()
End If
End Sub
supershagua 2005-03-12
  • 打赏
  • 举报
回复
up
supershagua 2005-03-11
  • 打赏
  • 举报
回复
up
hamadou 2005-03-11
  • 打赏
  • 举报
回复
哦,我说错了,对于ctrl,alt,shift等虚键,要在样式表的列的textbox的keydown事件中写的。明天再来看看!
cwwhy 2005-03-11
  • 打赏
  • 举报
回复
sorry 学习中。。。
supershagua 2005-03-11
  • 打赏
  • 举报
回复
麻烦hamadou(闵峰)给点例子,谢谢了
supershagua 2005-03-11
  • 打赏
  • 举报
回复
up
haoztao 2005-03-11
  • 打赏
  • 举报
回复
不知道,帮顶!
amendajing 2005-03-11
  • 打赏
  • 举报
回复
mark
supershagua 2005-03-11
  • 打赏
  • 举报
回复
cwwhy() ,我的环境是WINFORM,不是WEB,hamadou()说法是正确的
cwwhy 2005-03-11
  • 打赏
  • 举报
回复
不用那么麻烦吧
我做过,用客户端脚本。
给datagrid的每一行(或者单元格)绑定onclick事件,用javascript(hidden控件)记住选择了哪些行,同时让选中的行改变底色。

hamadou 2005-03-11
  • 打赏
  • 举报
回复
要继承datagrid,创建用户控件,然后重写processcmdkey事件,否则,在datagrid中优先触发的是命令键!
supershagua 2005-03-11
  • 打赏
  • 举报
回复
hamadou(闵峰),能不能详细点?好像datagrid没有ProcessCmdkey方法啊?
加载更多回复(2)

16,554

社区成员

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

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