首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题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)    

积极原创作者 
goodboy1881 (13)
wangchinaking (58)
iiprogram (67)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
smallnest (61)
CSDN - 文档中心 - .NET 阅读:13335   评论: 9    参与评论
标题   Henry手记:Datagrid事件响应     选择自 Latitude 的 Blog
关键字   Datagrid 事件响应
出处  

                                                Henry手记 Datagrid事件响应

                                 韩睿  ( 12/31/2002)

 

Happy New Year!辛苦了一年,大家可以好好放松一下,尽管这个元旦只放一天假。谢谢CSDN的工作人员,辛辛苦苦地忙碌了一年,服务器扩容、网站改版……希望在明年CSDN再接再励,工作更出色,让网友们更开心。祝福大家心想事成,万事如意!

本文主要介绍.net Datagrid控件的事件响应,关于事件响应机制问题请参见拙作Windows 窗体引介(二) 。本文讨论的是Datagrid的鼠标响应与键盘响应问题:

一、鼠标响应

由于Datagrid的集合性结构(这在拙作Datagrid结构剖析系列文章中已经详细说明了),使得用户不清楚鼠标响应的响应区与处理者。请看图1

 

                 图1  Datagrid响应区命名

1. 单击事件

如果用户要单击datagrid来激发某相应事件,可以使用Datagrid.HitTest方法来获得单击在Datagrid上的位置,必由系统通知您单击在何处。如下代码:

   Private Sub DataGrid1_MouseDown(ByVal sender As Object, ByVal e As _

System.Windows.Forms.MouseEventArgs) Handles DataGrid1.MouseDown

        Dim myGrid As DataGrid = CType(sender, DataGrid)

        Dim hti As System.Windows.Forms.DataGrid.HitTestInfo

        hti = myGrid.HitTest(e.X, e.Y)

        Select Case hti.Type  '以下展示的是该类型枚举的全部内容

            Case System.Windows.Forms.DataGrid.HitTestType.None

                MsgBox("你单击的是背景")

            Case System.Windows.Forms.DataGrid.HitTestType.Cell

                MsgBox("你单击的单元格位于行:" & hti.Row & ",  列:" & hti.Column)

            Case System.Windows.Forms.DataGrid.HitTestType.ColumnHeader

                MsgBox("你单击的是第" & hti.Column & "列的列头")

            Case System.Windows.Forms.DataGrid.HitTestType.RowHeader

                MsgBox("你单击的是第" & hti.Row & "行的行头")

            Case System.Windows.Forms.DataGrid.HitTestType.ColumnResize

                MsgBox("你单击的是第" & hti.Column & "列的边框")

            Case System.Windows.Forms.DataGrid.HitTestType.RowResize

                MsgBox("你单击的是第" & hti.Row & "行的边框")

            Case System.Windows.Forms.DataGrid.HitTestType.Caption

                MsgBox("你单击的是标题 ")

            Case System.Windows.Forms.DataGrid.HitTestType.ParentRows

                MsgBox("你单击的是父行 ")

        End Select

 End Sub

2. 双击事件(感谢acptvb网友的帮助)

在上面的单击事件中稍加修改,就可得到双击事件,只需要在sub里加入如下的判断语句:

    If e.Button = MouseButtons.Left And e.Clicks = 2 Then

Dim myGrid As DataGrid = CType(sender, DataGrid)

    

End Select

End If

您再试一下运行,却发现其它一切正常,只有单元格双击事件获得不到,这是什么原因呢?道理很简单,就是在您第一次单击cell时,datagrid还可以获得消息,但是单击的结果是使焦点落入了您单击的那个cell中去了,您的第二次鼠标点击事件的响应者就不再是datagrid,而是cell中的textbox了。(如果不是很理解这个,请看一下我专栏中的datagrid结构剖析文章)。那么怎么样通知datagrid还有一次本属于双击cell事件的第二次点击呢?首先我们应该明晰何谓两次单击与双击,它们的区别就在于鼠标点击两下之间的时间间隔,间隔短的就是双击事件,达到一定长度后就被视为是两次单击(时间间隔的设定其实是可以人工完成的,在您机器的“控制面板”中有“鼠标”一项,里面就有调整这个时间间隔的工具)。这个时间设定完毕后,可以通过SystemInformation.DoubleClickTime方法去获得。

现在我们来理一下思路:

(1)     设置一个公用变量gridMouseDownTime,用于记录点击时的绝对时间;

(2)       DataGrid1_MouseDown事件处理程序中记录下第一次点击的时间:

If hit.type= System.Windows.Forms.DataGrid.HitTestType.Cell then

   gridMouseDownTime = DateTime.Now

End If

(3)       Datagridcell内嵌的textbox中设置鼠标点击事件(mousedown;

设置方法请看我专栏中的datagrid结构剖析文章,事件处理程序的设置方法请看我专栏中的windows窗体引介(二)中的事件响应部分,在此不重复解释了:

Dim ts As New DataGridTableStyle() 

        Dim aColumnTextColumn As DataGridTextBoxColumn

        DataGrid1.DataSource = dt

        Me.HenryDatagrid1.DataSource = dt

        ts.MappingName = dt.TableName

        Dim numCols As Integer

        numCols = dt.Columns.Count

Do While (i < numCols) '重绘所有的列

            aColumnTextColumn = New DataGridTextBoxColumn()

            '夺过对textbox内落下光标的控制权,但你仍可以输入值

AddHandler aColumnTextColumn.TextBox.MouseDown, New MouseEventHandler _

(AddressOf TextBoxMouseDownHandler)

            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)

(4)       在上述事件的事件处理程序中比较时间间隔,从而判断是否是datagrid中对某一个cell进行了双击:

      Private Sub TextBoxMouseDownHandler(ByVal sender As Object, ByVal e As MouseEventArgs)

             If (DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime)) Then 判断时间间隔

                MsgBox("DataGrid 的 DoubleClick  ")

            End If

        End If

End Sub

在这里需要读者注意的是,你点击的cell当然应该是没有被聚焦的(就是没有变蓝的),如果已经变蓝,再双击它就看不到弹出的"DataGrid 的 DoubleClick"对话框了,因为此时你的两次点击都是落在textbox里了,成为了textbox的双击事件,你可以在TextBoxMouseDownHandler中加入如下代码来进行观察:

If e.Button = MouseButtons.Left And e.Clicks = 2 Then

            MessageBox.Show("在单元格的textbox中的双击  ")

        Else

            If (DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime)) Then

                MessageBox.Show("DataGrid 的 DoubleClick  ")

             End If

     End If

您可以完善上述的代码,以实现您的鼠标事件响应的需要。

 

键盘事件响应看来得明年再讨论了,我得去买菜了,不然女朋友回来要发飙了。再次祝福大家新年好!

 

----

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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

 

 

 


相关文章
对该文的评论
chenyu001 ( 2004-06-08)
  DataGrid myGrid = (DataGrid) sender;
chenyu001 ( 2004-06-08)
DataGrid Grid=Convert.ChangeType(sender,typeof(Grid));
renbing ( 2004-03-10)
当用户对DG进行了排序后,就不能用这个方法了。可以参考

http://www.thescarms.com/dotNet/DataSetRowNum.asp

How do I get the current row from a DataSet after my bound DataGrid was sorted?


"可以通过DG.CurrentCell.RowNumber得到当前行号,然后可以通过datatable.rows(行号)来访问其中DG为DATAGRID "
eagle19811219 ( 2004-03-10)
我是新手
谁能告诉我这行程序的意思及c#实现啊。。。。谢谢大虾们拉。。。。
Dim myGrid As DataGrid = CType(sender, DataGrid)
sdewen2003 ( 2003-12-03)
請教您一個問題:
您在  "..... '夺过对textbox内落下光标的控制权,但你仍可以输入值

AddHandler aColumnTextColumn.TextBox.MouseDown, New MouseEventHandler (AddressOf _TextBoxMouseDownHandler)

這一句時候,程序怎么去執行 TextBoxMouseDownHandler ???為什么我運行的時候不運行 
"   Private Sub TextBoxMouseDownHandler(ByVal sender As Object, ByVal e As MouseEventArgs)

             If (DateTime.Now < gridMouseDownTime.AddMilliseconds(SystemInformation.DoubleClickTime)) Then                          ‘判断时间间隔

                MsgBox("DataGrid 的 DoubleClick  ")

            End If

        End If              " 的呢????  救命吧>>>>>>>>  在下詭謝!!!!