购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱24
波澜起伏
——清除DataGridView中数据时产生的陷阱

1.陷阱产生的场景

清除DataGridView控件中数据最简单的办法就是设置该控件的数据源为空,但是这会将DataGridView控件中的数据结构一起清除,所以实用性不够好。另外一种办法就是使用DataGridView控件的Rows属性的Clear方法,但使用该方法清除DataGridView控件中的行可能会产生异常。

例4.24 清除DataGridView中数据时产生的陷阱(光盘位置:光盘\MR\Instance\4\24\ DataGridViewReset),该实例的实现过程如下。

在本实例的窗体中添加一个DataGridView控件、一个BindingSource组件和两个Button控件,分别用来显示数据、绑定数据源、清除数据及退出窗体,如图4.48所示。

在该窗体的Load事件中,通过自定义方法GetDataTable获取DataTable类型的数据源,并在DataGridView控件中显示数据记录,代码如下:

在“清空”按钮的Click事件中,编写如下代码:

运行本实例,单击“清空”按钮后,系统产生不能清除此列表的异常提示信息。这说明不能使用Clear方法清空绑定数据源的DataGridView控件,还需另寻解决方案。

通过查看Load事件的代码可知,DataGridView控件中显示的数据实质上来自通过GetDataTable方法获取的DataTable实例,那么就从DataTable实例入手,通过清空DataTable实例来实现间接清空DataGridView控件,实现该功能的方法如下:

修改“清空”按钮的Click事件中的代码,使用DataGridViewReset方法来清空数据,运行本实例,单击“清空”按钮后,仍然出现异常,如图4.49所示。

图4.48 清空数据

图4.49 异常提示

2.陷阱的分析

通过上面的异常提示,初步认定DataTable实例的引用dt为空,于是添加对dt的快速监视,结果如图4.50所示。

从图4.50可知dt的值为空。进一步分析,DataGridView控件的数据源肯定不为空,这可以从图4.48中看到。然而dt的值是由DataGridView控件的数据源转换而来的,这说明问题发生在类型转换上。在类型转换过程中使用了as运算符,该运算符有个很重要的特点,在无法进行类型转换时,as返回null。于是接下来添加对dgv.DataSource(DataGridView控件的数据源)的快速监视,如图4.51所示。

图4.50 快速监视

图4.51 快速监视

从上图4.51中看到,dgv.DataSource的值类型为BindingSource,那么使用as运算符将该值转换为DataTable类型,其转换结果必然为null。

dgv.DataSource的值类型为BindingSource很容易理解,在窗体的Load事件中,程序首先将获得的DataTable类型的数据源绑定到BindingSource组件上,然后再将BindingSource组件绑定到DataGridView控件上,这样DataGridView控件的最直接的数据源是Binding Source组件,而不是DataTable实例,虽然DataGridView控件中显示的是DataTable实例中的数据。

3.陷阱的解决方法

根据上面的分析,解决办法就是,先从DataGridView控件中获取BindingSource实例,然后从BindingSource组件中获取DataTable类型的数据源,最后清空DataTable实例,本实例的初步修改代码如下:

考虑到DataGridView控件可以直接绑定到DataTable类型数据源的情况,所以上面修改后的代码并不完美,需要进一步判断DataGridView控件的DataSource属性值的具体类型,最终修改代码如下: wbvnQSxT37m5LGup7gV61F+NOVeWwVS4901J9EmvC4E2zt9IyYdPZJTQTZgnYFIX

点击中间区域
呼出菜单
上一章
目录
下一章
×