The problem is that the first click of a double click may be caught by the datagrid (and used to activate the cell) while the second click goes to the TextBox for the columnstyle object. This means the TextBox thinks this is a singleclick, and does not fire its doubleclick event.5.42  How do I catch a doubleclick in my datagrid? 
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q869q

解决方案 »

  1.   

    分为两种,参见下面的文章
    我们在本节中讨论的是图1-(1)及1-(2)所示的情况,即焦点是落在Datagrid的框格上。一般的键盘事件响应是用KeyPress、KeyDown或KeyUp事件处理程序中的(键盘响应的顺序是KeyDown->KeyPress->KeyUp),我们也来如法炮制一下:Private Sub DataGrid1_KeyPress(ByVal sender As Object, ByVal e As _System.Windows.Forms.KeyPressEventArgs) Handles DataGrid1.KeyPress        MsgBox("你输入的是:" + e.KeyChar.ToString)End Sub现在运行一下程序,当您点击键盘上的“0-1”“A-Z”、“Enter键”、“Backspace键”等时,会弹出“你输入的是…”对话框,但是当你点击“Ctrl键”“Alt键”“Shift键”时会毫无反应,点击方向键、Tab键时,焦点会相应发生变动,而对话框却不会相应弹出。也就是说,KeyPress不能截得虚键,这是因为KeyChar表示的是ASCII码表中有的键码。要截得虚键,我们用KeyDown来试试:Private Sub DataGrid1_KeyDown(ByVal sender As Object, ByVal e As _System.Windows.Forms.KeyEventArgs) Handles DataGrid1.KeyDown        MsgBox("你输入的是:" + e.KeyCode.ToString)End Sub搞定了,我们可以截得“Ctrl键”“Alt键”“Shift键”了(组合键问题也就迎刃而解了,对吧?),等等,方向键、Tab键、PgUp、PgDown为什么还不理我们?看来是Datagrid控件把它们藏起来了,怎么处理?后面再来说吧。现在请关注这样一个需求,我们不是已经可以截得“Enter键”了吗?我想在用户键入Enter时,响应Tab键的事件处理程序。来吧,用KeyDown试试(KeyPress也行):Private Sub DataGrid1_KeyDown(ByVal sender As Object, ByVal e As _System.Windows.Forms.KeyEventArgs) Handles DataGrid1.KeyDown        If e.KeyCode = Keys.Enter Then            SendKeys.Send("{Tab}")  ‘通知系统调用Tab键的事件处理程序        End IfEnd Sub运行一下程序,我们将焦点落在图1-(1)的位置,敲下Enter键,怎么样?果然程序把Enter键当成了Tab键来执行了,焦点落入到第一行的第二列那个单元格上了!那我再敲Enter键,咦,焦点怎么不跳动了?呵呵,当然不会动了,因为现在焦点已经被单元格获取了。2.        Datagrid单元格上的键盘响应单元格上的键盘响应主要是针对能显示的字符输入(这也是单元格的主要作用嘛!),当然还有Backspace/Delete/Home/End这样的功能键。那么怎样来截得键盘信息呢?事件的对象现在是单元格了,可是我们在VS.NET的代码编辑器的“类名”下拉框中却看不到可以用的类,是什么东东的KeyDown/KeyPress/KeyUp事件呢?如果您看过我写的Datagrid结构剖析系列文章,您应该会很清楚,单元格的直接领导就是“列”了。所以我们应该在列上动动脑筋。让列来承接这项任务。我们来完成的需求是:实现单元格的数值框功能,就是只能在单元格中输入数字0-9,以及小数点“.”与回退键(Backspace键),Form_load中的代码的参数声明见Datagrid结构剖析(一):        Dim ts As New DataGridTableStyle()          Dim aColumnTextColumn As DataGridTextBoxColumn         DataGrid1.DataSource = dt        ts.MappingName = dt.TableName         Dim numCols As Integer        numCols = dt.Columns.Count         Dim i As Integer = 0        Do While (i < numCols) '重绘所有的列            aColumnTextColumn = New DataGridTextBoxColumn()AddHandler aColumnTextColumn.TextBox.KeyPress, New KeyPressEventHandler(AddressOf Column_KeyPress) '让列中的单元格来响应KeyPress事件            aColumnTextColumn.HeaderText = dt.Columns(i).ColumnName            aColumnTextColumn.MappingName = dt.Columns(i).ColumnName            ts.GridColumnStyles.Add(aColumnTextColumn)  '增加一种自定义的column风格            i = (i + 1)        Loop        DataGrid1.TableStyles.Add(ts) '增加一种自定义的表风格    ……‘事件处理程序,同样适用于其它Textbox用于数值框处理的情况。  Private Sub Column_KeyPress(ByVal sender As Object, _                      ByVal e As System.Windows.Forms.KeyPressEventArgs)         MsgBox("You have pressed the " & e.KeyChar)        If Not (IsNumeric(e.KeyChar) Or e.KeyChar = ChrW(8) Or e.KeyChar = ChrW(46)) Then            e.Handled = True        End If运行一下程序,您还能在单元格中输入“A-Z”这样的字符吗?当然还可以利用赋值方法来实现:在类中先声明(原因请参见拙作《Windows 窗体引介(二) 》):  Friend WithEvents Column1 As TextBox  Friend WithEvents Column2 As TextBox然后在Form_load中编写代码如下(同样见Datagrid结构剖析(一)的参数声明):Dim myGridTableStyle As DataGridTableStyle = New DataGridTableStyle()        myGridTableStyle.MappingName = dt.TableName        DataGrid1.TableStyles.Add(myGridTableStyle)        Dim TempColumn As DataGridTextBoxColumn        TempColumn = DataGrid1.TableStyles(0).GridColumnStyles(0)        Column1 = TempColumn.TextBox        TempColumn = DataGrid1.TableStyles(0).GridColumnStyles(1)  ……事件处理程序:Private Sub Column1_Keypress(ByVal sender As Object, _                   ByVal e As System.Windows.Forms.KeyPressEventArgs) _                   Handles Column1.KeyPress      If Not (IsNumeric(e.KeyChar) Or e.KeyChar = ChrW(8) Or e.KeyChar = ChrW(46)) Then            e.Handled = TrueEnd IfEnd SubPrivate Sub Column2_Keydown(ByVal sender As Object, _                         ByVal e As System.Windows.Forms.KeyEventArgs) _                         Handles Column2.KeyDown        MsgBox("You have pressed the " & e.KeyCode)End Sub运行一下程序,你会发现第一列已经实现了数值框功能,第二列会在接受键盘请求后报告用户按下的是什么键。这么一处理,我们可以轻松地针对各列的单元格进行我们想要的处理了(不管是KeyPress,KeyDown,还是其它Textbox能响应的事件,我们都可以来处理了!怎一个爽字了得!)继续第一节提出的问题,我们在单元格获得响应时来按下“Enter键”发现会有两种情况:(1)当单元格的内容没有任何变化时,按下此键没有任何响应;(2)当单元格的内容发生变动后,按下此键,焦点会落入下一行同一列的那个单元格里去了。我们在上述的事件处理程序中来截取“Enter键”,完了,却截不到了,不论是KeyPress还是KeyDown!那些第一节中就束手无策的虚键:方向键、Tab键、Pgup/PgDn,当然仍然截不到。怎么办?它们藏到哪去了?下次再讨论吧,敬请继续关注!