首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
coofucoo (105)
Drate (69)
lphpc (30)
smallnest (61)
iiprogram (64)
downmoon (32)
danny_xcz (49)
btbtd (81)
qingrun (66)
tyrone1979 (21)
CSDN - 文档中心 - .NET 阅读:11963   评论: 0    参与评论
标题   Henry手记 - Datagrid键盘事件响应(一)     选择自 Latitude 的 Blog
关键字   Datagrid 键盘 事件响应
出处  

                                 Henry手记 Datagrid键盘事件响应(一)

                        韩睿  ( 01/19/2003)

 

大家好!新年里有没有给自己写下新年计划,督促自己做点什么呢?我最希望的当然是大家能一如继往的支持我,让我更有动力写出更多更好的文章奉献给关心.NET的朋友。

上一篇关于Datagrid的鼠标事件响应给大家勾勒出了Datagrid事件响应的特点,其中一个重要的问题就是要分清是Datagrid的事件还是单元格中的事件,响应对象是不同的。今天我们讨论的键盘事件,也请注意区分它们之间的关系。

1.        Datagrid上的键盘响应

Datagrid与数据源绑定后,会呈现出如图1所示的形式。当Datagrid被聚焦后,焦点会首先落在第一行第一列的单元格上(注意:不是单元格内),如图1-(3)所示。在该单元格上单击一下鼠标,会出现如图1-(4)所示的情况,焦点落入了单元格中。

 

 

1 Datagrid聚焦图

我们在本节中讨论的是图1-(1)1-(2)所示的情况,即焦点是落在Datagrid的框格上。一般的键盘事件响应是用KeyPressKeyDownKeyUp事件处理程序中的(键盘响应的顺序是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键、PgUpPgDown为什么还不理我们?看来是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 If

End 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 = True

End If

End Sub

Private 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

运行一下程序,你会发现第一列已经实现了数值框功能,第二列会在接受键盘请求后报告用户按下的是什么键。这么一处理,我们可以轻松地针对各列的单元格进行我们想要的处理了(不管是KeyPressKeyDown,还是其它Textbox能响应的事件,我们都可以来处理了!怎一个爽字了得!)

继续第一节提出的问题,我们在单元格获得响应时来按下“Enter键”发现会有两种情况:(1)当单元格的内容没有任何变化时,按下此键没有任何响应;2)当单元格的内容发生变动后,按下此键,焦点会落入下一行同一列的那个单元格里去了。

我们在上述的事件处理程序中来截取“Enter键”,完了,却截不到了,不论是KeyPress还是KeyDown!那些第一节中就束手无策的虚键:方向键、Tab键、Pgup/PgDn,当然仍然截不到。怎么办?它们藏到哪去了?下次再讨论吧,敬请继续关注!

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

     请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/


相关文章
对该文的评论