如何動態新增RadioButton控制項在GroupBox的Container內

前一篇文章有提到要進行聰明牌型提示。一副十三支的牌,有時候可以選擇的牌型很多樣,有時候卻很少。

因此,我想在Container內用RadioButton的方式來提出可以讓使用者選擇成是已經判斷出來可以用的牌型。也就是想在GroupBox內動態產生RadioButton控制項方式進行。

我參考了以下的網站: http://61.219.235.182:101/taiwan/msdn/library/2002/Apr-2002/whitepaper/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.htm

這網站裡面寫的是在Forms內產生動態的Button。我略改了一下來用做我產生RadioButton控制項以及處理的類別。RadioButtonArray類別的程式如下:

class RadioButtonArray : System.Collections.CollectionBase
{
private GroupBox thisGroupBox = new GroupBox();
int startX = 0, startY = 0;
public RadioButtonArray(GroupBox myGroupBox)
{
thisGroupBox = myGroupBox;
this.AddNewRadioButton();
}

public RadioButtonArray(GroupBox myGroupBox, string radioBtnString)
{
thisGroupBox = myGroupBox;
this.AddNewRadioButton(radioBtnString);
}

public RadioButtonArray(GroupBox myGroupBox, int positionX, int positionY)
{
thisGroupBox = myGroupBox;
startX = positionX;
startY = positionY;
this.AddNewRadioButton();

}

public RadioButtonArray(GroupBox myGroupBox, int positionX, int positionY, string radioBtnString)
{
thisGroupBox = myGroupBox;
startX = positionX;
startY = positionY;
this.AddNewRadioButton(radioBtnString);

}


public void AddNewRadioButton()
{
// 建立 Button 類別的新執行個體。
RadioButton aRadioButton = new RadioButton();
// 將按鈕加入集合的內部清單。
this.List.Add(aRadioButton);
// 將按鈕加入 HostForm 欄位參考之表單的
// 控制項集合。
thisGroupBox.Controls.Add(aRadioButton);
// 設定按鈕物件的初始屬性。
aRadioButton.Top = startY + (Count-1) * 25;
aRadioButton.Left = startX;
aRadioButton.Tag = this.Count;
aRadioButton.Text = "RadioButton " + this.Count.ToString();
}

public void AddNewRadioButton(string radioBtnString)
{
// 建立 Button 類別的新執行個體。
RadioButton aRadioButton = new RadioButton();
// 將按鈕加入集合的內部清單。
this.List.Add(aRadioButton);
// 將按鈕加入 HostForm 欄位參考之表單的
// 控制項集合。
thisGroupBox.Controls.Add(aRadioButton);
// 設定按鈕物件的初始屬性。
aRadioButton.Top = startY + (Count-1) * 25;
aRadioButton.Left = startX;
aRadioButton.Tag = this.Count;
aRadioButton.Text = radioBtnString;
}

public RadioButton this[int Index]
{
get
{
return (RadioButton)this.List[Index];
}
}

//無參數, 移除最後一項
public void Remove()
{
// 檢查確定有要移除的按鈕。
if (this.Count > 0)
{
// 從控制項集合移除
// 最後加入陣列的按鈕。注意存取陣列
// 的索引子。
thisGroupBox.Controls.Remove(this[this.Count - 1]);
this.List.RemoveAt(this.Count - 1);
}
}

//有參數, 移除index項之控制項
public void Remove(int index)
{
// 檢查確定有要移除的按鈕。
if ((this.Count > 0)&&(index < this.Count))
{
// 從控制項集合移除
// 第index陣列的按鈕。注意存取陣列
// 的索引子。
thisGroupBox.Controls.Remove(this[index]);
this.List.RemoveAt(index);
}

for (int i = 0; i < Count; i++)
{
this[i].Top = startY + i * 25;
this[i].Left = startX;
}
}
}

類別是繼承自CollectionBase。建構函式是以多型方式來建構。也就是在你的Container GroupBox內建立第一個RadioButton。允許你可以設定此第一個RadioButton的初始位置與其Text要寫甚麼。也就是以下

的四個建構函式:
public RadioButtonArray(GroupBox myGroupBox)
public RadioButtonArray(GroupBox myGroupBox, string radioBtnString)
public RadioButtonArray(GroupBox myGroupBox, int positionX, int positionY)
public RadioButtonArray(GroupBox myGroupBox, int positionX, int positionY, string radioBtnString)

針對此RadioButton集合,我們可以動態的新增RadioButton控制項,用public void AddNewRadioButton(string radioBtnString)或是public void AddNewRadioButton()來新增控制項。此集合的個數會用Count紀錄下

來,此部分安置RadioButton的擺放位置是循序而下的。而Add也是新增到最後一項,而非任意的Index。目前尚未寫新增任意Index位置的RadioButton,若要寫會用InsertRadioButton的函式名稱命名。另外

,此class也有撰寫Remove來進行Remove Radio Button的動作。不過,此函式我有撰寫可以讓其Remove任意Index的RadioButton。然後,會再重設該Index後面的RadioButton位置,讓其向上補上。

如何運用此簡單的class呢? 您可以如以下的方式使用呼叫,

RadioButtonArray aa = new RadioButtonArray(this.gupBoxSuggest, 10, 50, "鐵支");
aa.AddNewRadioButton("葫蘆");
aa.Remove(0); //刪除鐵支的那個選項,並且葫蘆的選項會往上遞補上去。

留言

這個網誌中的熱門文章

C# 不規則陣列不定長度設定方法

多維陣列的Resize

C#利用DateTime估計程式執行時間