首页 > 编程 > .NET > 正文

在 Visual Basic .NET 和 Visual C# .NET 中创建控件数组

2024-07-10 13:04:04
字体:
来源:转载
供稿:网友

在 visual basic .net 和 visual c# .net 中创建控件数组
matthew a. stoecker
visual studio team
microsoft corporation
2002 年 1 月

摘要:本文介绍如何使用 visual basic® .net 和 visual c#™ .net 创建和管理控件数组。

目录

  • 简介
  • 前提
  • 创建项目
  • 实现集合
  • 公开控件数组
  • 创建公共事件处理程序
  • 测试项目
  • 总结

简介


数组为使用共享公共功能的控件组提供了一种方便的方式。例如,控件组可以用来显示相关数据,或者在单击时提供相关的操作。visual basic .net 和 c# 本身并不支持创建控件数组,但您可以通过编程来复制控件数组的全部功能。本文将指导您创建一个复制控件数组功能的简单组件。
控件数组的某些用处如下所示:
  • 通过索引访问具有相同名称的控件集合,您可以按编号检索和设置属性,并遍历数组中的所有控件。这一操作的典型语法如下:
    ' visual basic 伪代码mycontrol(myindex).myproperty = myvaluemycontrol(myindex + 1).mymethod// c# 伪代码mycontrol[myindex].myproperty = myvalue;mycontrol[myindex + 1].mymethod
  • 使用单个事件处理程序处理多个控件的事件,检索并使用这些事件中的索引,如下例所示:
    ' visual basic 伪代码private sub mycontrol_click(sender as object, e as eventargs)   messagebox.show("您已单击 mycontrol 编号" & _      mycontrol.index)end sub// c# 伪代码private void mycontrol_click(system.object sender, system.eventargs e)   {      messagebox.show("您已单击 mycontrol 编号" +         mycontrol.index);   }
  • 在运行时动态添加或删除控件,如下所示:
    ' visual basic 伪代码dim i as integerfor i = 1 to 5   ' 插入代码以创建控件并为属性分配值。next i// c# 伪代码for (int i = 1; i < 6; i++){   // 插入代码以创建控件并为属性分配值。 }

visual basic .net 和 c# 允许您复制部分此类功能,例如,使用代理将多个控件中的事件绑定到单个事件处理程序。但是,如果将该功能并入单个动态的、易于管理的组件,可能会更方便。本文中,我们将创建使用以下内容的组件:
  • 索引和排序控件的集合。按钮集合将用于演示。
  • 处理来自派生按钮的单击事件的事件处理程序。
  • 允许通过索引引用控件及其成员的代码。
  • 在窗体中动态添加和删除控件的代码。

前提

  • 熟悉组件及其工作原理。
  • 对多态有所了解。有关详细信息,请参阅 polymorphism in components(英文)。
  • 了解 visual basic .net 或 c# .net 语法。

创建项目


本节中,我们将创建和命名项目,并在项目中添加一个类。该类将封装实现控件数组的代码。
创建 buttonarrayproject 和 buttonarray 组件
  1. file(文件)菜单上,指向 new(新建),然后选择 project(项目)以打开 new project(新建项目)对话框。
  2. 从 visual basic 或 visual c# 项目列表中选择 windows application(windows 应用程序)项目模板,并在 name(名称)框中键入 buttonarrayproject
  3. file(文件)菜单中,选择 save all(全部保存)以保存项目。

实现集合


buttonarray 类将通过实现集合来完成支持和组织控件数组的任务。集合是一个对象,它包含经过索引的对象变量的列表,以及在集合中添加、删除或者操作对象的方法。本节中,我们将创建继承自 system.collections.collectionbase(.net 框架中的类,提供集合所需的很多功能)的类,并实现提供所需功能的方法。
创建继承的类
  1. project(项目)菜单中,选择 add class(添加类)。
  2. 相应地将类命名为 buttonarray.vb buttonarray.cs
    将打开包含该类的 code editor(代码编辑器)。
  3. 在类声明中,指定此类是从 .net 框架的 system.collections.collectionbase 类继承而来的。
    ' visual basicpublic class buttonarray   inherits system.collections.collectionbaseend class// c#public class buttonarray : system.collections.collectionbase{   // 省略了由设计器添加的代码。}

system.collections.collectionbase 类提供集合所需的许多功能。其中包括 list 对象(跟踪集合所包含的对象)、count 属性(维护当前集合中的对象总数)和 removeat 方法(按特定索引删除对象)。在实现控件数组集合时,要用到这些功能。
由于所有控件数组组件都要与一个窗体相关联,因此需要添加一个字段以保留对该窗体的引用。通过创建专用的只读字段来保留该引用,可以确保每个控件数组组件只与一个窗体相关联。
在组件中添加专用的只读字段
  • 直接在类声明中添加以下行:
    ' visual basicprivate readonly hostform as system.windows.forms.form// c#private readonly system.windows.forms.form hostform;

必须在集合中实现的第一个方法是 addnewbutton。此方法将创建新的按钮控件,并将其添加到所需的窗体中。还需要使用此方法设置新按钮的初始属性。
实现 addnewbutton 方法
  • 在包含 buttonarray 类的 code editor(代码编辑器)中,键入以下代码:
    public sub addnewbutton()   ' 创建 button 类的新实例。   dim abutton as new system.windows.forms.button()   ' 将按钮添加到集合的内部列表。   me.list.add(abutton)   ' 将按钮添加到由 hostform 字段    ' 引用的窗体的控件集合中。   hostform.controls.add(abutton)   ' 设置按钮对象的初始属性。   abutton.top = count * 25   abutton.left = 100   abutton.tag = me.count   abutton.text = "按钮 " & me.count.tostringend sub// c# public void addnewbutton(){   // 创建 button 类的新实例。   system.windows.forms.button abutton = new       system.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 = "按钮 " + this.count.tostring();}

此方法将:
  1. 创建新按钮。
  2. 将新按钮添加到内部列表和由 hostform 引用的窗体的控件集合中。
  3. 设置初始属性,包括将 tag 属性设置为按钮的索引。您可以在本节中添加代码以设置控件的其他属性。

还必须创建一个构造函数(对组件进行实例化时运行的方法),用于设置 hostform 字段的值,并且只要创建控件数组类的新实例,便可自动在窗体中添加新按钮。您可以通过以下方式完成此任务。
创建构造函数
  • 创建类的构造函数。
    ' visual basicpublic sub new(byval host as system.windows.forms.form)   hostform = host   me.addnewbutton()end sub// c# // 使用此构造函数替换默认的构造函数。public buttonarray(system.windows.forms.form host){   hostform = host;   this.addnewbutton();}

    构造函数需要一个参数,即放置按钮数组的窗体。它指定提供给 hostform 字段的值,然后调用类的 addnewbutton 方法在窗体中添加新按钮。

公开控件数组


您已经创建了一种方法在数组中创建和跟踪控件,现在需要向其他开发人员公开这些控件。可以使用一个属性来执行此操作。您将创建一个默认属性 (visual basic) 或索引程序 (c#),根据索引返回一个对特定按钮的引用。这也使您能够通过编程方式使用控件数组的典型 mybuttonarray(myindex) 语法。
创建默认属性
  • 在组件中添加以下代码。
    ' visual basicdefault public readonly property item(byval index as integer) as _   system.windows.forms.button   get      return ctype(me.list.item(index), system.windows.forms.button)   end getend property// c#public system.windows.forms.button this [int index]{get   {      return (system.windows.forms.button) this.list[index];   }}

实现 remove 方法


您已经创建了公开数组中的按钮所需的属性,现在可以实现从数组中删除按钮的机制。要从数组中删除按钮,必须从集合的内部 list 对象和窗体的 controls 集合中将其删除。
实现 remove 方法
  • 在组件中添加以下方法。
    ' visual basicpublic sub remove()   ' 检查以确保存在要删除的按钮。   if me.count > 0 then      ' 从宿主窗体控件集合中删除添加到数组      ' 的最后一个按钮。请注意在访问数组时      ' 默认属性的使用。      hostform.controls.remove(me(me.count -1))      me.list.removeat(me.count -1)   end ifend sub// c#public void remove()}   // 检查以确保存在要删除的按钮。   if (this.count > 0)   {      // 从宿主窗体控件集合中删除添加到数组      // 的最后一个按钮。请注意在访问数组时      // 索引的使用。      hostform.controls.remove(this[this.count -1]);      this.list.removeat(this.count -1);   }}

创建公共事件处理程序


最后一步是创建事件处理程序以处理数组的公共事件。本例中,我们将创建一种方法来处理按钮的单击事件,然后添加代码以将事件与事件处理程序相关联。
创建公共事件处理程序
  • 在组件中添加以下方法。
    ' visual basicpublic sub clickhandler(byval sender as object, byval e as _   system.eventargs)   messagebox.show("您已单击按钮 " & ctype(ctype(sender, _      button).tag, string))end sub// c#public void clickhandler(object sender, system.eventargs e){   system.windows.forms.messagebox.show("您已单击按钮 " +       (string)((system.windows.forms.button) sender).tag);}

    此方法显示一个消息框,通过检索存储在按钮的 tag 属性中的索引来指示单击了什么按钮。注意,此方法的签名与它将要处理的事件的签名相同,这是事件处理程序所要求的。

您还需要将事件与事件处理程序相关联。
将事件与事件处理程序相关联
  • 在 addnewbutton 方法中添加以下代码。
    ' visual basicaddhandler abutton.click, addressof clickhandler// c#abutton.click += new system.eventhandler(clickhandler);

测试项目


完成项目之后,您需要创建一个应用程序来测试组件的功能。
创建测试应用程序
  1. 在 solution explorer(解决方案资源管理器)中,右击 form1 并从快捷菜单中选择 view designer(视图设计器)。
    将打开包含 form1 的设计器。
  2. 从工具箱中,将两个按钮添加到窗体中。
  3. 将这些按钮重新定位到窗体的右侧。
  4. 按以下所示设置按钮的属性。 按钮名称文本button1btnadd添加按钮button2btnremove删除按钮
  5. 在 solution explorer(解决方案资源管理器)中,右击 form1 并从快捷菜单中选择 view code(查看代码)。
    将打开包含 form1 的 code editor(代码编辑器)。
  6. 在 form1 的类声明中,声明控件数组对象。
    ' visual basic' 声明新的 buttonarray 对象。dim mycontrolarray as buttonarray// c#// 声明新的 buttonarray 对象。buttonarray mycontrolarray;
  7. 在窗体的构造函数中,在方法末尾前面添加以下代码:
    ' visual basicmycontrolarray = new buttonarray(me)// c#mycontrolarray = new buttonarray(this);

    此语句将创建一个新的 buttonarray 对象。参数(methis)将引用创建新 buttonarray 的窗体,并将成为放置按钮数组的窗体。
  8. 在 solution explorer(解决方案资源管理器)中,右击 form1 并从快捷菜单中选择 view designer(视图设计器)。
  9. 在设计器中,双击 btnadd 以打开包含 btnadd_click 事件的 code editor(代码编辑器)。
  10. btnadd_click 方法中,添加代码以调用 mycontrolarray 的 addnewbutton 方法:
    ' visual basic' 调用 mycontrolarray 的 addnewbutton 方法。mycontrolarray.addnewbutton()' 更改按钮 0 的 backcolor 属性。mycontrolarray(0).backcolor = system.drawing.color.red// c#// 调用 mycontrolarray 的 addnewbutton 方法。mycontrolarray.addnewbutton();// 更改按钮 0 的 backcolor 属性。mycontrolarray[0].backcolor = system.drawing.color.red;
  11. 在 solution explorer(解决方案资源管理器)中,右击 form1 并从快捷菜单中选择 view designer(视图设计器)。
  12. 在设计器中,双击 btnremove 以打开包含 btnremove_click 事件的 code editor(代码编辑器)。
  13. btnremove_click 方法中,添加以下代码:
    ' visual basic' 调用 mycontrolarray 的 remove 方法。mycontrolarray.remove()// c#// 调用 mycontrolarray 的 remove 方法。mycontrolarray.remove();
  14. 保存项目。

测试项目
  1. debug(调试)菜单中,选择 start(开始)。
    将打开 form1,其中包含三个按钮,分别标为 add button(添加按钮)、remove button(删除按钮)和 button 1(按钮 1)。
  2. 单击 button 1(按钮 1)。
    注意,屏幕将显示一个消息框,其中正确显示了索引。
  3. 单击几次 add button(添加按钮)按钮。
    每单击一次都会向窗体添加一个新按钮。单击每个新按钮都将显示一个消息框,正确报告该按钮的索引。另外请注意,button 0(按钮 0)的颜色已变为红色,这是由于 btnadd_click 事件中的以下行所导致的:
    mycontrolarray(0).backcolor = system.drawing.color.red
  4. 单击几次 remove button(删除按钮)按钮。
    每单击一次都会从窗体中删除一个按钮。
  5. 单击此按钮,直至删除窗体左侧的所有按钮。
  6. 再次单击 add button(添加按钮)按钮。
    按钮将再次被添加到窗体中,并用正确的索引进行编号。

总结


本文演示了如何创建封装控件数组功能的组件。其中包括如何创建方法以动态地在窗体中添加和删除控件,以及通过默认的属性或索引程序来公开对象。因为实现了所有功能,所以可以通过编写组件的自定义代码来扩展控件数组。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表