很多时侯,我们需要如上图一样的一排按钮,他们需要互锁,很显然,创建一个控件数组编程很方便,代码也紧凑容易阅读。
在VB6下面,很方便,先放置一个按钮,复制,再粘贴,提示是否创建控件数组,系统会自动生成数组,然后在控件的Click事件中自动传入一个参数Index,通过这个Index就可以知道按下的是那个按钮。
然而......在VB.NET下,不再支持控件数组了,因为在VB.NET中对事件模型作了很大改动,引入控件集合模型,使用控件数组没有存在的必要。很多从VB6转过来的程序员感到非常不方便而且难受。
如果不采用控件数组,如果控件数量很多情况下,每个按钮都对应有事件,这样程序很分散可读性很差,比如cmd1_Click,cmd2_Click……,如果在一个事件中处理,如cmd_Clcik(byval Index as integer),再在程序中根据Index不同值作不同处理,这样代码很紧凑而且可读性很好。
刚好在我手头方案中需要用到控件数组,在查阅资料学习的情况下,成功实现VB.NET下模拟VB6控件数组功能,现分享如下:
第一步:新建一个类myButton。
这个类除了从系统按钮类中继承按钮所有属性之外,另外增加了Index属性及myClick事件,使之在点击myButton时(Click事件)关联自定义myButton_Click事件,并在事件中触发事件myClick将Index值返回。
第二步:在需要创建按钮窗体产生控件数组bcmd(5),这里需要注意的是,必须指定数组大小,在例子中,需要6个按钮,所以是5(0-5)。然后创建一个myButton的实例,设置好参数后装入数组,然后用controls的Add方法加载到窗体显示,最后所有按钮的事件都在cmd_Click中处理,达到和VB6控件数组一样的使用效果。
可以想象,如果不采用这种方式,6个按钮要实现互锁,而且要变换颜色,代码就相当分散而且可读性差。那有上面代码看起简洁、易懂?
下面是程序运行结果,点那个按钮会返回该按钮的Index,是不是很爽?