.NET中新增控制元件陣列 (轉)

worldblog發表於2008-01-22
.NET中新增控制元件陣列 (轉)[@more@]

新增陣列

在裡面我好像沒有找到有關於控制元件陣列的說明,但是前兩天偶在網上看到了一篇關於如何在.NET裡面實現控制元件陣列的文章(該文章請參看MSDN).記得大學的時候在使用VB的時候使用過控制元件陣列,可是到了.NET的時代好像沒有了.當時可以用控制元件陣列作很多繁瑣的事情,可以動態的生成一些功能和目的基本相同的一組文字框和一堆標籤.這些控制元件陣列響應同一個事件,我們在使用它的時候可以直接透過來訪問.我使用.NET以後好像繫結讓一切變的如此簡單,好像控制元件陣列沒有什麼用了,但是在前面的一次開發中我還是偶然的想到了使用控制元件陣列,苦於不知道如何申明後來發現.NET不支援這個東東了.其實如果我們很瞭解FCL的話我想這個實現起來也不難!好了廢話就不說了下面開始我們的建立工作.這次我們建立的是Button的陣列(也是MSDN上的例子.本文的原型以及程式碼均來自MSDN,如果想要了解更多的詳細資訊請參考MSDN的幫助),首先我們用到了CollectionBase (請參考.com/library/default.?url=/library/en-us/cpref/html/frlrfsystemcollectionllectionbaseclasstopic.asp">) 類,該類提供了一個抽象的強型別集合的基類.我們可以用它來實現我們的控制元件陣列.首先我們需要建立一個從CollectionBase繼承的類,我們稱之為ButtonArray.用來做存放Button的容器.下面是實現的程式碼:

namespace ButtonArrayProject{

 

  using System;

  ///

  /// ButtonArray 的摘要說明。

  ///

  public class ButtonArray : System.Collections.CollectionBase{

:namespace prefix = o ns = "urn:schemas-microsoft-com::office" />

  // 容器的一個引用,引用該控制元件陣列所在的窗體的一個引用

  private readonly System..Forms.FoHostForm;

  // 新增一個新的按鈕

  public System.Windows.Forms.Button AddNewButton(){

  // 建立一個新的按鈕例項

  System.Windows.Forms.Button aButton = new System.Windows.Forms.Button();

  // 將該新的控制元件新增到(this)列表中

  this.List.Add(aButton);

  // 將控制元件新增到父窗體的控制元件集合中

  HostForm.Controls.Add(aButton);

  // 設定該控制元件的屬性

  aButton.Top = Count * 25;

  aButton.Left = 100;

  // 用Button的Tag表示控制元件陣列中的索引

  aButton.Tag = this.Count;

  aButton.Text = "Button " + this.Count.ToString();

  // 新增一個事件響應

  aButton.Click += new System.EventHandler(ClickHandler);

  // 返回該新的控制元件

  return aButton;

  }

  // 刪除控制元件陣列中的最後一個元素

  public void Remove(){

  // 檢測該控制元件陣列中是否有控制元件

  if(this.Count > 0){

  // 如果有則先從父容器中刪除最後一個元素

  // 注意:此處是透過索引訪問

  this.HostForm.Controls.Remove(this[this.Count-1]);

  // 刪除控制元件陣列中的最後一個控制元件

  this.List.RemoveAt(this.Count-1);

  }

  }

  // 新增一個事件出來

  public void ClickHandler( sender, System.EventArgs e) {

  // 用MessageBox返回一條訊息

  System.Windows.Forms.MessageBox.Show("你點選的是 " +

  ((System.Windows.Forms.Button) sender).Tag.ToString());

  }

  // 帶父窗體引用的建構函式

  public ButtonArray(System.Windows.Forms.Form host){

  // 為父窗體的引用賦值

  this.HostForm = host;

  // 新增一個預設的按鈕

  this.AddNewButton();

  }

  // 控制元件陣列的索引可以利用索引訪問(只能得到)

  public System.Windows.Forms.Button this[int index]{

  get{

  return (System.Windows.Forms.Button)this.List[index];

  }

  }

  }

}

為了測試我們新增一個的工程.在該工程的Form1中放入兩個Button用來新增或者刪除控制元件陣列中的控制元件.同時我們還需要在Form1中宣告一個ButtonArray的.在Form1的建構函式中例項該物件, 程式碼如下:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace ButtonArrayProject

{

  public class Form1 : System.Windows.Forms.Form{

  private ButtonArray btnArray ;

  private System.Windows.Forms.Button btnAdd;

  private System.Windows.Forms.Button btnRemove;

  private System.ComponentModel.Container components = null;

  public Form1(){

  InitializeComponent();

  this.btnArray = new ButtonArray(this);

  }

  protected overr void Dispose( bool disposing ){

  if( disposing )

  {

  if (components != null)

  {

  components.Dispose();

  }

  }

  base.Dispose( disposing );

  }

  #region Windows

  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(352, 136);

  this.btnAdd.Name = "btnAdd";

  this.btnAdd.Size = new System.Drawing.Size(112, 23);

  this.btnAdd.TabIndex = 0;

  this.btnAdd.Text = "AddNewButton";

  this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);

  //

  // btnRemove

  //

  this.btnRemove.Location = new System.Drawing.Point(352, 192);

  this.btnRemove.Name = "btnRemove";

  this.btnRemove.Size = new System.Drawing.Size(112, 23);

  this.btnRemove.TabIndex = 1;

  this.btnRemove.Text = "RemoveButton";

  this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);

  //

  // Form1

  //

  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

  this.ClientSize = new System.Drawing.Size(512, 381);

  this.Controls.Add(this.btnRemove);

  this.Controls.Add(this.btnAdd);

  this.Name = "Form1";

  this.Text = "Form1";

  this.ResumeLayout(false);

  }

  #endregion

  [STAThread]

  static void Main() {

  Application.Run(new Form1());

  }

  private void btnAdd_Click(object sender, System.EventArgs e) {

  this.btnArray.AddNewButton();

// 這裡就是透過索引訪問的例項

  this.btnArray[0].BackColor = Color.Blue;

  }

  private void btnRemove_Click(object sender, System.EventArgs e) {

  this.btnArray.Remove();

  }

  }

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998131/,如需轉載,請註明出處,否則將追究法律責任。

相關文章