C# DataGridView控件 SourceBinding和SelectionChange的诡异问题

因为数据分析的需要这几天在做一个C#小程序,用于从数据库读取显示数据,并简单画图。

程序界面如图所示:


主要分为四个数据区,两个数据筛选区,一个画图区。图上分别用不同的颜色来框出。

一共6个DataGridView。按从左至右,自上而下的顺序,分别命名为datagridview1到datagridview6。


主要流程是:

启动程序之后,自动载入所有有关的表格到最左边的datagridview1

监听datagridview1的SelectionChange事件,当datagridview1中的一项(一个数据表的名称)被选中之后。将所选的表的两类数据载入到中间的两个datagridview2、datagridview3

监听datagridview2、datagridview3的SelectionChange、Enter事件,当两事件之一发生时。在右上的两个datagridview4、datagridview5中载入与其相关的其他表的数据

监听datagridview4、datagridview5的RowEnter事件,当事件发生时,查询datagridview1中所指定的一个factor数据,并按大小排序显示。


在这里,对datagridview1、datagridview2、datagridview3都监听了SelectionChange事件。但是很奇怪的是,它们在初始时的触发时机完全不同。

对于datagridview1而言,有三种情况

1. 程序刚启动时,datagridview1的SelectionChange发生了三次

2. 而点击刷新按钮给它重新binding数据,SelectionChange发生了两次。其中一次指的数据行是刷新前的数据行,第二次则是新数据的第0行。另外值得一提的是,BindingComplete发生在第二次SelectionChange之后,因而不能通过BindingComplete来判断是否是第二次SelectionChange事件

3. 改变选择项,SelectionChange只发生一次

而对于datagridview2、datagridview3而言,也有三种情况

1. 程序刚启动,datagridview1载入数据,并默认被选中了第一行。紧接着给datagridview2、datagridview3进行source binding。这时,SelectionChange只发生了一次!而datagridview发生了三次

2. 与datagridview1一致

3. 与datagridview1一致


我猜测是datagridview1在初始化完成之后,其他的datagridview也完成了初始化。但是,datagridview2在程序启动时只激发了一次SelectionChange事件,仍然很奇怪。

更奇怪的是,就在我以为datagridview4、datagridview5应该大致也和datagridview2、datagridview3时。datagridview4第一次被binding数据之后,SelectionChage又发生了三次!


msdn对SelectionChange的说明是:

This event occurs whenever cells are selected or the selection is canceled, whether programmatically or by user action. For example, this event is useful when you want display the sum of the currently selected cells.

When you change the value of the CurrentCell property, the SelectionChanged event occurs before the CurrentCellChanged event. Any SelectionChanged event handler accessing the CurrentCell property at this time will get its previous value.”

即选中或取消选择时发生,或当前单元格的属于被更改时也会发生。

这样的话,在重新binding数据时,会发生两次是因为1:取消选择;2:重新选中

但是,不知道为什么初始化的时候,会多发生一次。难道是初始化的时候也会激发一次?而datagridview2、datagridview3是因为事件绑定的时机晚了,以致错过了前二次?


以上是关于SelectionChange事件的问题,我的解决办法是给它们分别加设标识位对各个DataGridView的状态进行区别。比较不爽。


另外一个诡异的问题是SourceBinding。

有些DataGridView,在绑定一个表格之后,马上就会发生SelectionChange事件,而有些不会……

也只能一个一个来识别它们的行为,然后没有默认选中,人为给它选中一行。

以上描述的前提是,这些DataGridView的属性基本是一样的。而datagridview2、datagridview3、datagridview4、datagridview5的属性完全一致。

比较头疼,待解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值