linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > asp.net >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·NetBPM工作流的一个示例:请假
·Office Web Components(OWC)绘
·asp.net正则表达式语法
·asp.net 2.0 ajax中使用PopupC
·Ado.Net读取Excel常见问题总结
·数据源为空时如何让GridView显
·如何让UpdatePanel支持文件上传
·C#.Net的常见面试试题和参考答
·asp.net ajax客户端编程+jquer
·Brettle.Web.NeatUpload.dll支
·ASP.NET使用Cookie
·ASP.NET DEMO 15: 同时支持行单
·如何使IE的后退按钮无效
·如何在ASP.NET中用OWC绘制图表
·asp.net:正确判断当前用户角色
最新文章
·Ajax Control Toolkit Animati
·讨论一下类似BlogEngine内一次
·使用CSS+SiteMap+UserControl+
·Asp.net中多彩下拉框的实现
·浅谈ASP.NET的Postback
·分清ASP.NET AJAX中的Extender
·Tip:在使用AjaxControlTookit
·有关注册DataItem的一些可能被
·IIRF(Ionic's Isapi Rewrite
·asp.net 客户端回调功能的实现
·关于控件部分的看法--读Progra
·为什么在vista上做开发
·如何封装JS和CSS文件为服务器端
·岂今我看过的最强的排序算法
·设计模式学习笔记之单件模式
Google
 
Datagrid事件响应(二)
[ 作者:  加入时间:2007-11-26 16:30:58  来自:Linux联盟收集整理 ]
 hi, 大家好。对于windows form中的datagrid控件的使用,我已经写了不少文章了,但也不断地收到网友的意见,希望再多写一点。应朋友的要求,我会再针对几个问题写一些文章,希望能带给您一点启发,能够熟练地使用Datagrid,更主要是希望您能举一反三,将处理问题的方法应用到对其它控件的使用中去。 yUSLinux联盟
   yUSLinux联盟
  本文主要解决在Datagrid中任意点击一个格子,都会出现选中一行的需求。通过本文,您也会了解焦点与控件的关系。 yUSLinux联盟
   yUSLinux联盟
  这个问题看上去很简单,但是,如果您平时留心的话,每次点击单元格时,我们就会点击到一个格子的内部,而不会选中一行。想要选中一行,只能点击每行的行头。 yUSLinux联盟
   yUSLinux联盟
  有朋友会说,就还不简单,我们可以把处理代码写在datagrid的mousedown事件处理程序中,用 hitTest判断选中的是哪一行哪一列的那个格子,然后就select那一行。 yUSLinux联盟
   yUSLinux联盟
  但是,……。当你照着做一下就会发现,不对了!每次点击了以后,还是老样子,焦点跑到textbox内部去了。这…… yUSLinux联盟
   yUSLinux联盟
  难道是Datagrid偷赖没有做我们要求它做的事!哦,你冤枉它了,其实它还是执行了的!只不过执行的速度太快了,我们根本没看清人家工作的结果。是谁动了它的奶酪? yUSLinux联盟
   yUSLinux联盟
  如果你看过我以前的文章,应该就不难理解:用户鼠标向Datagrid的一格点去->Datagrid先接收到焦点,执行你要求它的事件->然后焦点就会落入此格内嵌的textbox中去,使textbox聚焦。(详细分析,请看拙作《Datagrid事件响应(一) 》) yUSLinux联盟
   yUSLinux联盟
  明白了吧,在datagrid刚刚执行了选中一行的操作之后,它内嵌的textbox就会引发一个聚焦事件,致使datagrid不再选中一行,而是把焦点更改到你所点击的内嵌textbox中去了。 yUSLinux联盟
   yUSLinux联盟
  所以,现在的解决思路就应该是:把代码写在焦点刚落入到datagrid内嵌的textbox中时的那个事件里。而对于textbox来说,焦点的落入与离开的过程都会激发什么事件,我们应该在什么事件中去写选中当前行的代码呢? yUSLinux联盟
   yUSLinux联盟
  按顺序来说,焦点会引发的控件事件为: yUSLinux联盟
   yUSLinux联盟
  顺序号 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  事件名 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  事件意义 yUSLinux联盟
   yUSLinux联盟
  1 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  Enter yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  焦点进入了控件 yUSLinux联盟
   yUSLinux联盟
  2 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  GotFocus yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  控件接收了焦点 yUSLinux联盟
   yUSLinux联盟
  3 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  Leave yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  输入焦点离开了控件 yUSLinux联盟
   yUSLinux联盟
  4 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  Validating yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  控件正在进行验证 yUSLinux联盟
   yUSLinux联盟
  5 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  Validated yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  控件完成了验证 yUSLinux联盟
   yUSLinux联盟
  6 yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  LostFocus yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
  控件失去焦点 yUSLinux联盟
   yUSLinux联盟
  那么,第一个会被引发的事件就是Enter了!好了,我们开工吧! yUSLinux联盟
   yUSLinux联盟
  现在把要做的工作梳理一下: yUSLinux联盟
   yUSLinux联盟
  (1) 找一个用于Datagrid的绑定数据源,使Datagrid有显示的数据; yUSLinux联盟
   yUSLinux联盟
  (2) 要写Datagrid内嵌的控件的事件处理程序,当然需要重新定义Datagrid的DataGridTableStyle; yUSLinux联盟
   yUSLinux联盟
  (3) 把Enter事件指派给每一个列风格GridColumnStyles; yUSLinux联盟
   yUSLinux联盟
  (4) 编写一个内嵌textbox的Enter事件处理程序; yUSLinux联盟
   yUSLinux联盟
  (5) 打完收工! yUSLinux联盟
   yUSLinux联盟
  程序如下: yUSLinux联盟
   yUSLinux联盟
  dim Dataset1 as New DataSet yUSLinux联盟
   yUSLinux联盟
  Dim dt As DataTable’ yUSLinux联盟
   yUSLinux联盟
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load yUSLinux联盟
   yUSLinux联盟
   '构建一简单的dataset yUSLinux联盟
   yUSLinux联盟
   dt = DataSet1.Tables.Add("MyTable") yUSLinux联盟
   yUSLinux联盟
   dt.Columns.Add("Col1", GetType(String)) yUSLinux联盟
   yUSLinux联盟
   dt.Columns.Add("Col2", GetType(Integer)) yUSLinux联盟
   yUSLinux联盟
   Dim row, row1 As DataRow yUSLinux联盟
   yUSLinux联盟
   row = dt.NewRow() yUSLinux联盟
   yUSLinux联盟
   row!Col1 = "name" yUSLinux联盟
   yUSLinux联盟
   row!Col2 = 123 yUSLinux联盟
   yUSLinux联盟
   dt.Rows.Add(row) yUSLinux联盟
   yUSLinux联盟
   row1 = dt.NewRow() yUSLinux联盟
   yUSLinux联盟
   row1!Col1 = "xxx" yUSLinux联盟
   yUSLinux联盟
   row1!Col2 = 123 yUSLinux联盟
   yUSLinux联盟
   dt.Rows.Add(row1) yUSLinux联盟
   yUSLinux联盟
   '构建完毕 yUSLinux联盟
   yUSLinux联盟
   DataGrid2.DataSource = dt yUSLinux联盟
   yUSLinux联盟
   Dim ts As New DataGridTableStyle() '就是它决定了datagrid是什么样的 yUSLinux联盟
   yUSLinux联盟
   Dim aColumnTextColumn As DataGridTextBoxColumn '要重写的东东 yUSLinux联盟
   yUSLinux联盟
   DataGrid1.DataSource = dt yUSLinux联盟
   yUSLinux联盟
   ts.MappingName = dt.TableName yUSLinux联盟
   yUSLinux联盟
   Dim numCols As Integer yUSLinux联盟
   yUSLinux联盟
   numCols = dt.Columns.Count yUSLinux联盟
   yUSLinux联盟
   Dim i As Integer = 0 yUSLinux联盟
   yUSLinux联盟
   Do While (i < numCols) '重绘所有的列 yUSLinux联盟
   yUSLinux联盟
   aColumnTextColumn = New DataGridTextBoxColumn() yUSLinux联盟
   yUSLinux联盟
   '夺过对textbox内落下光标的控制权 yUSLinux联盟
   yUSLinux联盟
   AddHandler aColumnTextColumn.TextBox.Enter, New EventHandler(AddressOf TextBoxEnterHandler) yUSLinux联盟
   yUSLinux联盟
   '要更改列头名,请改下句的HeaderText值 yUSLinux联盟
   yUSLinux联盟
   aColumnTextColumn.HeaderText = dt.Columns(i).ColumnName yUSLinux联盟
   yUSLinux联盟
   aColumnTextColumn.MappingName = dt.Columns(i).ColumnName yUSLinux联盟
   yUSLinux联盟
   ts.GridColumnStyles.Add(aColumnTextColumn) '增加一种自定义的column风格 yUSLinux联盟
   yUSLinux联盟
   i = (i + 1) yUSLinux联盟
   yUSLinux联盟
   Loop yUSLinux联盟
   yUSLinux联盟
   DataGrid1.TableStyles.Clear() yUSLinux联盟
   yUSLinux联盟
   DataGrid1.TableStyles.Add(ts) '增加一种自定义的表风格 yUSLinux联盟
   yUSLinux联盟
   End Sub yUSLinux联盟
   yUSLinux联盟
   Private Sub TextBoxEnterHandler(ByVal sender As Object, ByVal e As System.EventArgs) yUSLinux联盟
   yUSLinux联盟
   DataGrid1.Select(DataGrid1.CurrentRowIndex) yUSLinux联盟
   yUSLinux联盟
  End Sub yUSLinux联盟
   yUSLinux联盟
  运行一下,然后我们来点击看看,咦,为什么被点击的那一格会有一块空白的东东,如图1所示: yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
   yUSLinux联盟
   图1 空白的东东 yUSLinux联盟
   yUSLinux联盟
  我们还有什么没考虑到?当然有,就是我最开始时所说的,Datagrid是一个网格,在每一个单元格之间还是有它的结构存在,要不用什么去安装一个个的textbox呀(想一下往面团里放芝麻的过程,那个面团就是datagrid,芝麻就是内嵌的控件,可以是textbox,可以是checkbox,可以是combobox,可以是其它的许多控件。合在一起,就是……烧饼,哈!看来又饿了)。 yUSLinux联盟
   yUSLinux联盟
  在被选中的这一格里,由于textbox是聚焦了,所以Datagrid在这一格里的部分就部屏蔽了。现在想要把它们都选中,方法很简单,就是仿照Datagrid的正常操作过程来做。什么时候一行能全部被选中,当然是点击行头,从焦点的角落来说,就是这一行没有一个单元格中有焦点落下! yUSLinux联盟
   yUSLinux联盟
  所以,重写一下Enter的事件处理程序如下,把你点击的那个textbox的visible设为false吧,它消失了,datagrid的整行才能被选中: yUSLinux联盟
   yUSLinux联盟
  Private Sub TextBoxEnterHandler(ByVal sender As Object, ByVal e As System.EventArgs) yUSLinux联盟
   yUSLinux联盟
   Dim inner As Control = sender yUSLinux联盟
   yUSLinux联盟
   inner.Visible = False yUSLinux联盟
   yUSLinux联盟
   DataGrid1.Select(DataGrid1.CurrentRowIndex) yUSLinux联盟
   yUSLinux联盟
  End Sub yUSLinux联盟
   yUSLinux联盟
  祝大家在SARS的阴影中保持健康与快乐,幸福永远与勤奋的你同在! yUSLinux联盟
   yUSLinux联盟
  ---- yUSLinux联盟
   yUSLinux联盟
  声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。 yUSLinux联盟
   yUSLinux联盟
  QQ: 18349592 yUSLinux联盟
   yUSLinux联盟
  E-Mail: henry7685@hotmail.com yUSLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·在DataGrid快速添加新行  (2007-11-26 16:30:30)
 ·VB.NET中关于DataGrid颜色的自定义  (2007-11-26 16:29:55)
 ·为DataGrid添加CheckBox控件  (2007-11-26 16:29:26)
 ·DataGrid控件通用打印类  (2007-11-26 16:28:56)
 ·创建完全可编辑的 DataGrid  (2007-11-26 16:28:22)
 ·Web Form中的Datagrid的自定义分页  (2007-11-26 16:27:40)
 ·格式化DataGrid的例子  (2007-11-26 16:27:11)
 ·为DataGrid添加自动编号功能  (2007-11-26 16:26:28)
 ·在DataGrid里添加确认删除的对话框  (2007-11-26 16:25:50)
 ·用嵌套的DataGrid实现主从式表的显示  (2007-11-26 15:35:59)