C#.NET中动态添加与删除控件 
 
  介绍

  数组为共享公用功能的一组控件一起工作提供了便捷的途径。例如,一组控件可能用于显示相关的数据,或者在被点击时提供相关的行为。C#本身并不支持控件数组的建立,但是你可以通过编程复制控件数组的所有功能。本文介绍复制控件数组功能的简单组件的建立。

控件数组的主要用处有:

1,使用相同的名称与索引访问一组控件,允许用编号检索和设置数据项并且在整个数组中重复。这个功能可以使用下面的代码实现。

伪代码
myControl[myIndex].MyProperty = myValue;
myControl[myIndex + 1].MyMethod
 
2,多个对象使用同一个事件处理程序(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 = 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 = "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     Text

  Button1 btnAdd     Add Button

  Button2 btnRemove   Remove Button

  5、在解决方案管理器中,右键点击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、保存项目

  测试该项目 http://www.w3sky.com/

  1、从Debug菜单中选择Start。

  Form1窗体被打开,上面有三个按钮,标签分别是Add Button、Remove Button和Button 1。

  2、点击Button 1。

显示了一个消息框,消息框正确地显示了索引。

  3、点击几次Add Button按钮。

每次点击会给窗体添加一个新按钮。点击任何一个新按钮将导致一个正确显示该按钮索引的消息框。注意Button 0的颜色改变为红色,是btnAdd_Click事件中下面一行的结果:

MyControlArray(0).BackColor = System.Drawing.Color.Red

  4、点击几次Remove Button按钮。

每次点击时从窗体上删除一个按钮。

  5、点击Remove Button按钮直到窗体右侧的所有按钮都被删除为止。

  6、再次点击Add Button按钮。

  按钮再次添加到窗体并且索引的编号正确。

  结论

  本文演示了怎样建立封装控件数组功能的组件。你可以看到怎样建立方法来动态地给窗体添加和删除控件,怎样通过默认属性或者索引器暴露对象。上面的代码已经实现了所有的功能,还可以通过为组件编写自定义代码来扩展控件数组。

代码:
form1.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace DAddControl
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.Button btnAdd;
  private System.Windows.Forms.Button btnRemove;
  ButtonArray MyControlArray;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();

//
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
   MyControlArray = new ButtonArray(this);
  }

/// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

#region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.btnAdd = new System.Windows.Forms.Button();
   this.btnRemove = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // btnAdd
   //
   this.btnAdd.Location = new System.Drawing.Point(216, 0);
   this.btnAdd.Name = "btnAdd";
   this.btnAdd.TabIndex = 0;
   this.btnAdd.Text = "Add Button";
   this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
   //
   // btnRemove
   //
   this.btnRemove.Location = new System.Drawing.Point(216, 240);
   this.btnRemove.Name = "btnRemove";
   this.btnRemove.TabIndex = 1;
   this.btnRemove.Text = "Remove Button";
   this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
   //
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
   this.ClientSize = new System.Drawing.Size(292, 266);
   this.Controls.Add(this.btnRemove);
   this.Controls.Add(this.btnAdd);
   this.Name = "Form1";
   this.Text = "Form1";
   this.ResumeLayout(false);

}
  #endregion

/// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }

private void btnAdd_Click(object sender, System.EventArgs e)
  {
   //from www.w3sky.com
   //调用MyControlArray的AddNewButton方法
   MyControlArray.AddNewButton();
   //改变Button 0的BackColor属性
   MyControlArray[0].BackColor = System.Drawing.Color.Red;
  }

private void btnRemove_Click(object sender, System.EventArgs e)
  {
   MyControlArray.Remove();
  }
 }
}

ButtonArray.cs

using System;
using System.Windows.Forms;

namespace DAddControl
{
 /// <summary>
 /// ButtonArray 的摘要说明。
 /// </summary>
 public class ButtonArray
  :System.Collections.CollectionBase
 {
  private readonly System.Windows.Forms.Form HostForm;

public ButtonArray()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

public ButtonArray(System.Windows.Forms.Form host)
  {
   HostForm = host;
   //this.AddNewButton();
  }

public System.Windows.Forms.Button 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 = "Button " + this.Count.ToString();
   aButton.Click += new System.EventHandler(ClickHandler);
   return aButton;
  }

public System.Windows.Forms.Button this [int Index]
  {
   get
   {
    return (System.Windows.Forms.Button) this.List[Index];
   }
  }

public void Remove()
  {
   //检查以确保有按钮可以删除
   if (this.Count > 0)
   {
    //from www.w3sky.com
    // 从主窗体上的控件集合的数组按钮数组中删除最后一个
    // 注意在访问数组时使用了默认属性
    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());
  }
 }
}

转载于:https://www.cnblogs.com/pcb_ghl/archive/2009/04/22/1441154.html

[转]C#.NET中动态添加与删除控件相关推荐

  1. WPF 中动态创建和删除控件

    WPF 中动态创建和删除控件 原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件 ...

  2. Winform DataGridView单元格中动态添加多个控件

    简介: 在DataGridView的单元格中动态添加多个控件.例如在DataGridViewTextBox单元格中,添加CheckBox和Button控件.主题思路就是一个动态控件的大小,位置,显示, ...

  3. VB6实现动态增加和删除控件数组中的控件2021-06-02

    VB6实现动态增加和删除控件数组中的控件 2021-6-3修改一个BUG 控件的添加: 1From1名称改为FrmWork 2.添加Picture控件名称改为PicCharacterContainer ...

  4. Unity NGUI中动态添加和删除sprite

    (以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链 ...

  5. JSP中动态添加或删除table的行

     个 想要实现如上图动态添加或者删除一行的功能,代码如下:(包含点击"环节参与人员"空白栏时弹出组织结构人员树时的弹窗功能) HTML部分: <body ><di ...

  6. Unity NGUI中动态添加和删除sprite(附上转载者注释)

    --------------------- 此部分为转载的感受. 原文对于NGUI如何动态添加删除sprite,以及调用NGUI中的图集Atlas都有很明确的代码. 转载括号内容附上转载作者(Bula ...

  7. DevExpress中实现代码动态添加MenuStrip菜单栏控件内容

    一.实现效果 二.实现操作 2.1.添加MenuStrip控件 2.2.编写动态添加菜单栏内容代码 /// <summary>/// 给菜单控件添加名称/// </summary&g ...

  8. JS实现动态添加和删除div

    实现方式一:只在最后一个数据中动态添加或者删除 | 背景 需要做一个页面,页面可以输入参数,点击确认按钮可以发请求给某接口.但是接口的某个字段是数组类型,所以在页面上需要实现添加或者删除元素的功能. ...

  9. 关于xib中添加collection view 控件引起brash

    首先这个问题我没有找到解决的办法,不知道问题出现在哪里,所以在这里贴个博文,看看有大神路过能把问题给解决了. 问题描述: 首先建立了一个新的项目,在stroyboard中添加collection vi ...

  10. VC++中combo box(组合框)控件使用说明/MFC COMBOBOX的使用

    转自:不知道... Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接 ...

最新文章

  1. python 代码转程序_python将代码转换成网页
  2. Python 基础教程:切片、迭代和列表生成式
  3. mysql实战20 | 幻读是什么,幻读有什么问题?
  4. CodeForces - 729D
  5. 在Apache环境下成功的运行ASP.NET
  6. 求100以内的所有素数
  7. 渗透测试PTES标准流程(超详细)
  8. 使用M0 DesignStart 的样例SoC(example system) - 1 SoC组件
  9. 一起学习荷花定律/金蝉定律和竹子定律
  10. mysql column specified twice_Mysql抛出Column 'descriptions' specified twice异常解决方法
  11. Robin:SEO从业者打造个人品牌的八个建议,白杨SEO个人品牌实战举例
  12. 放弃了又何需执着 ?
  13. leetcode 会员转让
  14. HIT CS:APP 计算机系统大作业 《程序人生-Hello’s P2P》
  15. macM1芯片通过第三方安装php
  16. 学习现代化的文章编写方式——关于Markdown语法的使用
  17. java实现word文档转pdf,并添加水印
  18. Annex-B和AVCC
  19. FPGA Altera Remote Update笔记
  20. Jmeter分布式压力测试全过程(阿里云ECS)

热门文章

  1. JavaScript学习(十四)---String对象中的模式匹配方法
  2. 基于 HTML5 的 3D 工业互联网展示方案
  3. [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
  4. 【设计模式】java设计模式总述及观察者模式
  5. (译)cocos2d精灵教程:第三部分
  6. 配置在一台三层交换上,不同VLAN相互通信
  7. iOS 使用CocoaPods
  8. 2个月面了鹅厂的5个部门,心态差点奔溃了......
  9. 如何合理地决定线程池大小?
  10. 阿里这样的高并发系统是如何做限流的?