分享
 
 
 

Henry手记-Datagrid事件响应(二)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Henry手记 - Datagrid事件响应(二)

韩睿 ( 5/6/2003)

hi,大家好。对于windows form中的datagrid控件的使用,我已经写了不少文章了,但也不断地收到网友的意见,希望再多写一点。应朋友的要求,我会再针对几个问题写一些文章,希望能带给您一点启发,能够熟练地使用Datagrid,更主要是希望您能举一反三,将处理问题的方法应用到对其它控件的使用中去。

本文主要解决在Datagrid中任意点击一个格子,都会出现选中一行的需求。通过本文,您也会了解焦点与控件的关系。

这个问题看上去很简单,但是,如果您平时留心的话,每次点击单元格时,我们就会点击到一个格子的内部,而不会选中一行。想要选中一行,只能点击每行的行头。

有朋友会说,就还不简单,我们可以把处理代码写在datagrid的mousedown事件处理程序中,用 hitTest判断选中的是哪一行哪一列的那个格子,然后就select那一行。

但是,……。当你照着做一下就会发现,不对了!每次点击了以后,还是老样子,焦点跑到textbox内部去了。这……

难道是Datagrid偷赖没有做我们要求它做的事!哦,你冤枉它了,其实它还是执行了的!只不过执行的速度太快了,我们根本没看清人家工作的结果。是谁动了它的奶酪?

如果你看过我以前的文章,应该就不难理解:用户鼠标向Datagrid的一格点去->Datagrid先接收到焦点,执行你要求它的事件->然后焦点就会落入此格内嵌的textbox中去,使textbox聚焦。(详细分析,请看拙作《Datagrid事件响应(一) 》

明白了吧,在datagrid刚刚执行了选中一行的操作之后,它内嵌的textbox就会引发一个聚焦事件,致使datagrid不再选中一行,而是把焦点更改到你所点击的内嵌textbox中去了。

所以,现在的解决思路就应该是:把代码写在焦点刚落入到datagrid内嵌的textbox中时的那个事件里。而对于textbox来说,焦点的落入与离开的过程都会激发什么事件,我们应该在什么事件中去写选中当前行的代码呢?

按顺序来说,焦点会引发的控件事件为:

顺序号

事件名

事件意义

1

Enter

焦点进入了控件

2

GotFocus

控件接收了焦点

3

Leave

输入焦点离开了控件

4

Validating

控件正在进行验证

5

Validated

控件完成了验证

6

LostFocus

控件失去焦点

那么,第一个会被引发的事件就是Enter了!好了,我们开工吧!

现在把要做的工作梳理一下:

(1) 找一个用于Datagrid的绑定数据源,使Datagrid有显示的数据;

(2) 要写Datagrid内嵌的控件的事件处理程序,当然需要重新定义Datagrid的DataGridTableStyle;

(3) 把Enter事件指派给每一个列风格GridColumnStyles;

(4) 编写一个内嵌textbox的Enter事件处理程序;

(5) 打完收工!

程序如下:

dim Dataset1 as New DataSet

Dim dt As DataTable’

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'构建一简单的dataset

dt = DataSet1.Tables.Add("MyTable")

dt.Columns.Add("Col1", GetType(String))

dt.Columns.Add("Col2", GetType(Integer))

Dim row, row1 As DataRow

row = dt.NewRow()

row!Col1 = "name"

row!Col2 = 123

dt.Rows.Add(row)

row1 = dt.NewRow()

row1!Col1 = "xxx"

row1!Col2 = 123

dt.Rows.Add(row1)

'构建完毕

DataGrid2.DataSource = dt

Dim ts As New DataGridTableStyle() '就是它决定了datagrid是什么样的

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()

'夺过对textbox内落下光标的控制权

AddHandler aColumnTextColumn.TextBox.Enter, New EventHandler(AddressOf TextBoxEnterHandler)

'要更改列头名,请改下句的HeaderText值

aColumnTextColumn.HeaderText = dt.Columns(i).ColumnName

aColumnTextColumn.MappingName = dt.Columns(i).ColumnName

ts.GridColumnStyles.Add(aColumnTextColumn) '增加一种自定义的column风格

i = (i + 1)

Loop

DataGrid1.TableStyles.Clear()

DataGrid1.TableStyles.Add(ts) '增加一种自定义的表风格

End Sub

Private Sub TextBoxEnterHandler(ByVal sender As Object, ByVal e As System.EventArgs)

DataGrid1.Select(DataGrid1.CurrentRowIndex)

End Sub

运行一下,然后我们来点击看看,咦,为什么被点击的那一格会有一块空白的东东,如图1所示:

图1空白的东东

我们还有什么没考虑到?当然有,就是我最开始时所说的,Datagrid是一个网格,在每一个单元格之间还是有它的结构存在,要不用什么去安装一个个的textbox呀(想一下往面团里放芝麻的过程,那个面团就是datagrid,芝麻就是内嵌的控件,可以是textbox,可以是checkbox,可以是combobox,可以是其它的许多控件。合在一起,就是……烧饼,哈!看来又饿了)。

在被选中的这一格里,由于textbox是聚焦了,所以Datagrid在这一格里的部分就部屏蔽了。现在想要把它们都选中,方法很简单,就是仿照Datagrid的正常操作过程来做。什么时候一行能全部被选中,当然是点击行头,从焦点的角落来说,就是这一行没有一个单元格中有焦点落下!

所以,重写一下Enter的事件处理程序如下,把你点击的那个textbox的visible设为false吧,它消失了,datagrid的整行才能被选中:

Private Sub TextBoxEnterHandler(ByVal sender As Object, ByVal e As System.EventArgs)

Dim inner As Control = sender

inner.Visible = False

DataGrid1.Select(DataGrid1.CurrentRowIndex)

End Sub

祝大家在SARS的阴影中保持健康与快乐,幸福永远与勤奋的你同在!

----

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

QQ: 18349592

E-Mail: henry7685@hotmail.com

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有