• 全部
  • VBS
  • .NET技术
  • VBA
  • VB网络编程
  • VB多媒体
  • VB数据库
  • VB控件
  • VB COM/DCOM
  • VB基础类
  • VB API
  • 问答

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

supershagua 2005-03-11 02:04:58
WINFORM中,能样实现按住Ctrl,用鼠标点击DataGrid任何一行对DATAGRID多选?目前我只能做到点击行头才能实现。
...全文
268 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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方法啊?
回复
相关推荐
发帖
VB
创建于2007-09-28

1.6w+

社区成员

VB技术相关讨论,主要为经典vb,即VB6.0
申请成为版主
帖子事件
创建了帖子
2005-03-11 02:04
社区公告
暂无公告