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


陷阱17
迷雾重重
——使用窗体的Controls属性遍历窗体控件时产生的陷阱

1.陷阱产生的场景

在Windows应用程序开发过程中,有时需要对窗体上控件进行统一处理,比如,统一清空窗体上TextBox控件的Text属性值、统一设置所有控件的Enabled属性值为false等情况。如果窗体上的控件很多,那么一个一个地处理控件,需要编写大量代码。有经验的程序员很容易想到使用foreach语句来遍历窗体的Controls属性,该属性能够获取包含在窗体内的控件的集合。使用该属性统一处理窗体上的控件,能够大大简化代码,但是若程序处理不当,就不会达到预期的效果。

例4.17 使用窗体的Controls属性遍历窗体控件时产生的陷阱(光盘位置:光盘\MR\ Instance\4\17\UseControls),该实例的实现过程如下。

本实例的窗体用于登记商品的销售发票信息,在窗体的文本框中输入发票信息,如商品名称、销售数量、购买单位的名称及购买单位的税号等,本实例运行后的窗体如图4.32所示。

窗体上“取消”按钮的功能是清空窗体中所有的文本框,实现清空文本框功能的ClearAllText方法的代码如下:

在上面的代码中,通过窗体的Controls属性获取窗体中的所有控件,然后使用is关键字判断当前的控件是否为TextBox,若是,则清空当前的文本框。如图4.32所示,在文本框中输入发票的相关信息,单击“取消”按钮后,窗体的显示效果如图4.33所示。

图4.32 输入发票信息

图4.33 清空发票信息

从图4.33中可以看出,并未清空所有的文本框,比如,用于输入单位名称和税号的文本框。

说明

“保存”按钮的事件代码并非本实例的主要讨论内容,所以源程序中并没有给出具体实现代码。

2.陷阱的分析

在图4.33中的执行结果可以初步判定,表示单位名称和税号的文本框未得到执行清空语句,进一步推测,这两个文本框可能不在窗体的Controls属性中。接下来添加如下检测代码,对窗体的Controls属性进行分析。

上面的程序运行结果如图4.34所示。

图4.34 测试结果

从测试结果可以看出,窗体的Controls属性中确实不存在表示单位名称和税号的文本框,因为这两个的控件名称分别为textBox5和textBox6。接下来观察这两个文本框与其他4个文本框的区别,发现这两个文本框被直接放入到GroupBox容器控件中,而其他的4个文本框被直接放入到窗体中,为此查看了窗体的InitializeComponent方法,在该方法中发现以下3条重要语句:

从上面的代码中很容易看出,窗体的Controls属性添加了groupBox1控件,而groupBox1控件的Controls属性又添加了这两个文本框,问题终于找到了。

3.陷阱的解决方法

由于表示单位名称和税号的两个文本框控件被直接添加到groupBox1控件的Controls属性中,所以需要以递归的方式遍历groupBox1控件的Controls属性,本实例修改后的代码如下:

说明

所有控件都继承自Control类,包括Form窗体在内,所以使用Control类作为ClearAllText方法的参数类型。 rr5/dsKx3N+bgT7BfJn83fxVewXse3KlpF9SHtGV1lD+7yQmkHmwj+bVFDx5jY6R

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