- 热门文章:
- · Henry手记 - Datagrid键盘事件响应(一)
- · 在ASP.NET下实现数字和字符相混合的验证码(C# Code)
- · 在ASP.NET下实现数字和字符相混合的验证码(vb.net Code)
- · 大数据量下的分页
- · 让Asp.NET的DataGrid可排序、可选择、可分页
- · 利用ASP.NET DataGrid显示主次关系的数据
- · 如何使用PagedDataSource來做DataRepeater的分頁的效果
- · ASP .NET 中的身份验证:.NET 安全性指导
- · 在Asp.Net中从sqlserver检索(retrieve)图片
- · 如何在ASP.Net 中把图片存入数据库
- · 在两个ASP.NET页面之间传递值
- · 用ASP.NET构建完整E-mail发送系统
上一篇:用ASP.NET设计优秀系统(一) >>
Henry手记 - Datagrid键盘事件响应(二)
但有个问题上一节没有交待,就是如何对Enter键、方向键、Tab键、Pgup/PgDn这些虚键进行拦截与处理?一般网友遇到这个问题,十有八九是出于这个目的:就是希望按Enter键时使光标在一行中向右一个格一个格跳(从“name”到“123”),而不是立即跳向同一列的下一行(到“xxx”)。(如图1所示)
图1 跳格演示
但是,我们在上一篇中用尽方法也截不下Enter键呀,看来这一键盘响应已经被控件封装为protected型了。控件编写人员把多个预定义的键盘绑定方案封装起来,称为快捷键。我们在Keydown/KeyPress中没办法拦截到Enter键和其它一些键盘按键正是这个原因。
快捷键与菜单快捷方式被称为命令键,应用程序会在对常规输入进行处理前的消息预处理过程中对它们进行处理。命令键也就始终比常规输入键具有优先权。
ProcessCmdKey 方法首先确定控件是否有上下文菜单,如果有,则允许 ContextMenu 处理命令键。如果命令键不是菜单快捷方式,且控件有父级,那么该键传递到父级的 ProcessCmdKey 方法。净效果是命令键在控件层次结构中向上“冒”。除了用户按下的键外,键数据还指示哪些(如果有的话)修改键与该键同时按下。修改键包括 SHIFT、CTRL 和 ALT 键(成为组合键)。
这里要注意:该方法必须返回 true,以指示它已经处理完命令键,或者 false,以指示该键不是命令键。在派生类中重写 ProcessCmdKey 方法时,控件应返回 true 以指示它已处理该键。对于未由该控件处理的键,应返回调用基类的 ProcessCmdKey 方法的结果。
如果不加返回值,会默认为false。这样你明明已经修改了处理方法,却会在执行完你的命令之后,继续执行父类中定义的该键盘按键的处理方法。
那么我们怎么处理文头的命题?解决之道就是自己写一个控件,继承自现有的Datagrid控件,再重写处理命令键响应程序ProcessCmdKey,来实现我们的需求。
步骤一:在vs.net编辑器中,“文件”->“新建”->“项目”,然后选择新建一个“Windows控件库”的项目:HenryDatagrid。这样运行的结果会生成一个DLL文件,而不是EXE执行文件;
步骤二:在HenryDatagrid.vb文件代码编辑窗口中加入有阴影的这句话:
Public Class HenryDatagrid
Inherits System.Windows.Forms.DataGrid ‘这表示新建的控件是Datagrid的派生控件
步骤三:在“类名”窗口中选择overrides,然后在“方法名称”窗口选择“ProcessCmdKey”(如图2所示)
图2 选择要重写的方法
然后就会出现一段空的ProcessCmdKey代码段,我们可以写入自己的代码:
Protected Overrides Function ProcessCmdKey
(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
Dim WM_KEYDOWN As Integer = 256 ‘消息响应的问题可以参考其他win32编程的文章
Dim WM_SYSKEYDOWN As Integer = 260
If ((msg.Msg = WM_KEYDOWN) Or (msg.Msg = WM_SYSKEYDOWN)) Then
Select Case keyData
Case Keys.Down
MsgBox("截到下箭头键")
Return True
Case Keys.Up
MsgBox("截到上箭头键")
Return True
Case Keys.Enter
SendKeys.Send("{Tab}")
Return True
Case Keys.Control + Keys.M
MsgBox("<CTRL> + m 组合键被截获")
Return True
Case Keys.Alt + Keys.Z
MsgBox("<ALT> + z 组合键被截获")
Return True
End Select
End If
End Function
然后运行一下,生成HenryDatagrid.dll文件
步骤四:再建立一个项目,然后在新项目的设计窗口的工具箱上单击鼠标右键,在弹出菜单中选择“添加引用”,然后在.net选项卡中占击“浏览”,选择到HenryDatagrid.dll,加入进来,然后您的工具箱上会多出一个HenryDatagrid的图标,在新项目中使用HenryDatagrid来代替datagrid控件。看一下,您所需要的“Enter跳格”事件就这样完成了。
建议:您在Keys.Enter代码中的Return True去掉,看一下会有什么情况发生。
这里说句题外话,我们在重写类方法时,必须也只能使用Overridable关键字修饰的Protected
方法。这是因为在VB中是用Overridable 关键字指定属性或方法可以在派生类中重写。没有这个东东的我们也没有资格重写了。
下一篇:Henry手记 - Datagrid键盘事件响应(一) >>
相关文章:
- · 用ASP.NET开发Web服务的五则技巧
- · 在两个ASP.NET页面之间传递值
- · 用DataReader还是DataSet?
- · 使用Mobile控件
- · 用javascript解决ASP.NET服务器控件造成的刷新问题
- · ASP.NET相关问题14问
- · ASP.NET中水晶报表的使用
- · ASP.NET编程中的十大技巧
- · 浅谈在ASP.NET中数据有效性校验的方法
- · 一个文件上传的类
- · ASP.NET中使用Caching
- · ASP.NET里的事务处理
- · ASP.NET中在线用户统计
- · 在ASP.net中使用OWC绘制统计图表
- · ASP.NET四种页面导航方式之比较与选择
- · 浅谈 XmlReader
- · 动态的管理ASP.NET DataGrid数据列
- · ASP.NET中的ViewState
- · asp.net上传图片并同时生成缩略图
- · ASP+全新接触(3) {转}
- · ASP+全新接触(4) {转}
- · 在ASP+ 中我们如何使用 Class 而不是组件
- · ASP+配置 — ASP+配置概念(一)
- · ASP+配置 — ASP+配置概念(二)
- · ASP+配置 — ASP+配置概念(三)
- · .NET编程中使用旧有的COM组件
- · ASP+ 学习笔记 5
- · asp+中文教程(四)-- 服务器端控制(二)
- · 什么是ASP+?(二)<转><译>
- · 什么是ASP+?(三)<转><译>
- · asp+ 输入检查(e 文,转)
- · ASP+ 学习笔记 3
- · asp+中文教程(一)---- -asp+简介、安装、以及如何显示中文
- · asp+中文教程(二)---- Asp+ Web Forms
- · asp+中文教程(三)-- 服务器端控制(一)
- · ASP+ 学习笔记 4
- · ASP+ 学习笔记 2
- · 今日读 asp.net 心得 ---- 比较意识流,神经衰弱勿进
