C#.NET中动态添加与删除控件数组为共享公用功能的一组控件一起工作提供了便捷的途径。
例如,一组控件可能用于显示相关的数据,或者在被点击时提供相关的行为。
C#本身并不支持控件数组的建立,但是你可以通过编程复制控件数组的所有功能。
本文介绍复制控件数组功能的简单组件的建立。
控件数组的主要用处有:1,使用相同的名称与索引访问一组控件,允许用编号检索和设置数据项并且在整个数组中重复。
这个功能可以使用下面的代码实现。
伪代码myControl[myIndex].MyProperty = myValue;myControl[myIndex + 1].MyMethod2,多个对象使用同一个事件处理程序(event handler)处理事件,在这些事件中检索和使用索引,代码如下:伪代码private void myControl_Click(System.Object sender, System.EventArgs e){Messagebox.Show("You have clicked MyControl number " +myControl.Index);}3,在运行时动态添加或者删除控件,代码如下:伪代码for (int i = 1; i < 6; i++){//插入代码来建立控件并给属性赋值}C#允许你复制与控件数组相关的一些功能。
例如,你能使用委托把多个对象的事件绑定到一个事件处理程序。
但是,如果把这些功能合并到一个动态的、容易管理的组件中更加简便。
本文将建立有下面特性的组件:·建立索引和排序控件的集合。
将使用按钮集合来演示。
·一个事件处理程序来处理衍生的按钮的点击事件。
·使用索引引用控件和成员的代码。
·给窗体动态添加和删除控件的代码。
建立项目在本节中将建立并命名一个项目,并给该项目添加一个类。
该类将封装实现控件数组的代码。
1、选择File-> New-> Project菜单打开New Project对话框。
2、从Visual C#项目列表中选择Windows Application项目模版,在Name框中输入ButtonArrayProject。
3、选择File-> Save All保存项目。
实现一个集合ButtonArray类会处理通过一个集合的实现来保存和组织控件数组的事务。
集合是包含索引对象变量列表的对象,也包含add、remove等方法和其它的操作对象。
本节中将建立一个继承自System.Collections.CollectionBase(.NET框架组件中提供必要的集合功能的类)的类,并实现提供必要功能的方法。
建立继承类的过程:1、从Project菜单中选择Add Class。
2、根据情况把类命名为ButtonArray.cs。
类的代码编辑器将打开。
3、在类的声明中,指定它继承自.NET框架组件的System.Collections.CollectionBase 类。
public class ButtonArray : System.Collections.CollectionBase{// 省略了设计者增加的代码}System.Collections.CollectionBase类为集合提供了很多必要的功能。
其中包括一个跟踪集合中对象的List对象,维护集合中当前对象数量的Count属性,允许删除特定位置索引的对象的RemoveAt方法。
在实现控件数组集合时会使用到它们。
因为每个控件数组与一个窗体关联,索引必须添加一个字段来保存该窗体的引用。
通过建立私有的、只读字段来保存引用,可以保证每个控件数组组件只与以一个窗体关联。
为组件建立私有、只读字段立即给类声明添加下面的代码:private readonly System.Windows.Forms.Form HostForm;在集合中实现的第一个方法是AddNewButton。
该方法建立一个新的按钮控件并把它添加到目标窗体。
你也可以使用该方法为新按钮设置初始属性。
实现AddNewButton方法在ButtonArray类的代码编辑器中输入下面的代码:public System.Windows.Forms.Button AddNewButton(){//为Button类建立新的实例System.Windows.Forms.Button aButton = newSystem.Windows.Forms.Button();//将该按钮添加到集合的内部列表this.List.Add(aButton);//把控件集合中的按钮添加到被HostForm字段引用的窗体HostForm.Controls.Add(aButton);//设置该按钮对象的初始属性aButton.Top = Count * 25;aButton.Left = 100;aButton.Tag = this.Count;aButton.Text = "Button " + this.Count.ToString();return aButton;}上面的方法的功能是:1、建立一个新按钮。
2、把它添加到内部列表和HostForm引用的窗体的控件集合。
3、设置初始属性,包括设置Tag属性来索引该按钮。
你可以在这一段中添加代码为控件设置更多的属性。
4、返回新按钮,这样它就能立即被修改并指定给其它的对象引用。
你必须建立一个构造函数(组件被初始化时运行的方法),当控件数组类的一个新实例被建立时,它用来设置HostForm字段的值并把新按钮添加到窗体。
可以使用下面的方式达到这个目的。
建立构造函数为类建立构造函数。
// 使用下面的构造函数代替默认的构造函数public ButtonArray(System.Windows.Forms.Form host){HostForm = host;this.AddNewButton();}构造函数需要一个参数,即放置按钮数组的窗体。
它把该值指定给HostForm字段,接着类的AddNewButton方法给窗体添加一个新按钮。
暴露控件数组现在已经建立了建立和跟踪数组中控件的途径,但是还必须把它们暴露给开发者。
可以通过属性实现这个功能。
我们将建立一个默认索引器基于特定按钮的索引返回它的引用。
这样你就能编程使用典型控件数组中的MyButtonArray(myIndex)语法了。
建立默认属性给组件添加下面的代码:public System.Windows.Forms.Button this [int Index]{get{return (System.Windows.Forms.Button) this.List[Index];}}实现Remove方法现在已经建立了暴露数组中按钮的属性,可以建立从数组中删除按钮的机制了。
为了从数组中删除一个按钮,必须从集合的内部List对象和窗体的Controls集合中删除它。
给组件添加下面的方法:public void Remove(){//检查以确保有按钮可以删除if (this.Count > 0){' 从主窗体上的控件集合的数组按钮数组中删除最后一个' 注意在访问数组时使用了默认属性HostForm.Controls.Remove(this[this.Count -1]);this.List.RemoveAt(this.Count -1);}}建立公用事件处理程序最后一步是为控件数组建立事件处理程序来处理公用的事件。
在演示中,将为按钮的点击事件建立一个方法,接着添加代码把该事件与事件处理程序关联。
建立公用事件处理程序给组件添加下面的方法:public void ClickHandler(Object sender, System.EventArgs e){System.Windows.Forms.MessageBox.Show("You have clicked button " +((System.Windows.Forms.Button) sender).Tag.ToString());}该方法通过检索存储在按钮的Tag属性的索引,显示一个消息框表明哪个按钮被点击了。
该方法的参数与被处理事件的相同,对于事件处理程序是必要的。
你也必须把该事件与事件处理程序关联。
把该事件与事件处理程序关联给AddNewButton方法添加下面的代码:aButton.Click += new System.EventHandler(ClickHandler);测试该项目现在组件已经完成了,需要建立一个应用程序来测试该组件。
建立测试应用程序1、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。
Form1的设计器被打开了。
2、给窗体添加两个按钮。
3、把这些按钮的位置调整到窗体的右侧。
4、设置这些按钮的属性:按钮Name TextButton1 btnAdd Add ButtonButton2 btnRemove Remove Button5、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Code。
Form1的代码编辑器被打开了。
6、在Form1的类声明中,声明下面的控件数组对象://声明新的ButtonArray对象ButtonArray MyControlArray;7、在窗体的构造函数中,在方法结尾前添加下面的代码:MyControlArray = new ButtonArray(this);该语句建立了一个新的ButtonArray对象。
它的参数this指向建立新ButtonArray的窗体,将成为放置按钮数组的窗体。
8、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。
9、在设计器中双击btnAdd来打开btnAdd_Click事件的代码编辑器。
10、在方法btnAdd_Click中添加代码调用MyControlArray的AddNewButton方法://调用MyControlArray的AddNewButton方法MyControlArray.AddNewButton();//改变Button 0的BackColor属性MyControlArray[0].BackColor = System.Drawing.Color.Red;11、在解决方案管理器中,右键点击Form1并从弹出菜单中选择View Designer。
12、在设计器中双击btnRemove来打开btnRemove_Click事件的代码编辑器。
13、在btnRemove_Click方法中添加下面的代码:// 调用MyControlArray的Remove方法MyControlArray.Remove();14、保存项目测试该项目1、从Debug菜单中选择Start。