[C#.NET][VB.NET] 如何設定 控制項陣列 / 動態加入控制項
在以前VB6時代常在用控制項陣列,只要屬性是相同的Name,再設定Index,就能簡單的使用陣列控制項,不過到了.NET之後卻變的有點不太一樣了。
用控制項陣列的好處就是可以省下不少重複的原始碼。
如何在.NET環境建立控制項陣列(手動建立)
1.首先先建立一個按鈕控制項,Text屬性設為:Static 1(叫啥米小都可以)
2.雙擊按鈕,便會產生 private void button1_Click(object sender, EventArgs e) { }
3.對那個控制項按Ctrl+滑鼠左鍵拖曳(拖幾個都行,並為按鈕修改Text、TabIndex屬性,以示區分)
4.在C#,這時不管點哪一個按鈕都會跑到 button1_Click 方法如下所示:
private void button1_Click(object sender, EventArgs e)
{
}
5.在VB,這時不管點哪一個按鈕都會跑到 button1_Click 方法如下所示:
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click, button2.Click, button3.Click
End Sub
6.在C#,在 Form1.Designer.cs 檔案中的按鈕Click事件,都是 button1_Click 方法;也可以手動輸入要處理的方法(this.button1_Click),就可以省去上述的動作(拖曳)。
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button2.Click += new System.EventHandler(this.button1_Click);
this.button3.Click += new System.EventHandler(this.button1_Click);
7.在VB,就比C#簡單多了,我們可以觀察到事件是由 Handles(VB已經幫我們處理好事件,變成Handles) 傳入至sender,或者你也可以在 Handles 後面手動加入要處理的方法(button1.Click, button2.Click, button3.Click),就可以省去上述的動作(拖曳)。
8.預設的控制項都是藉由sender參數來傳遞事件,所以我們可以用它來偵測哪一個按鈕被按下,我們可以設定中斷點觀察一下sender的狀態。
9.所以我們必須要將sender參數轉型成Button,便能取出sender傳遞的資料。((Button)(sender)).Text;
C#
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "你按下: " + ((Button)(sender)).Text;
textBox2.Text = "索引值: " + ((Button)(sender)).TabIndex.ToString();
}
VB
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click, button2.Click, button3.Click
textBox1.Text = "你按下: " & DirectCast((sender), Button).Text
textBox2.Text = "索引值: " & DirectCast((sender), Button).TabIndex.ToString()
End Sub
如何在.NET環境建立控制項陣列(程式動態建立)
1.建立Button物件
Button[] btuArray = new Button[3];
btuArray[0] = new Button();
btuArray[1] = new Button();
btuArray[2] = new Button();
2.加入控制項this.Controls.Add(btuArray[i]);
3.事件註冊
btuArray[i].Click += new EventHandler(button_Click);
C#
private void button4_Click(object sender, EventArgs e)
{
//1.建立Button物件
Button[] btuArray = new Button[3];
btuArray[0] = new Button();
btuArray[1] = new Button();
btuArray[2] = new Button();
for (int i = 0; i != btuArray.Length; i++)
{
//2.加入控制項
this.Controls.Add(btuArray[i]);
btuArray[i].Text = "Dynamic " + i;
btuArray[i].Top = 12+btuArray[i].Height * i;
btuArray[i].Left = 13;
//3.為Click事件註冊
btuArray[i].Click += new EventHandler(button_Click);
}
}
private void button_Click(object sender, EventArgs e)
{
Console.WriteLine(sender.ToString());
Console.WriteLine(((Button)(sender)).Text);
Console.WriteLine(((Button)(sender)).TabIndex);
textBox1.Text = "你按下: " + ((Button)(sender)).Text;
textBox2.Text = "索引值: " + ((Button)(sender)).TabIndex.ToString();
}
VB
Private Sub button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button4.Click
'1.建立Button物件
Dim btuArray As Button() = New Button(2) {}
btuArray(0) = New Button()
btuArray(1) = New Button()
btuArray(2) = New Button()
Dim i As Integer = 0
While i <> btuArray.Length
'2.加入控制項
Me.Controls.Add(btuArray(i))
btuArray(i).Text = "Dynamic " & i
btuArray(i).Top = 12 + btuArray(i).Height * i
btuArray(i).Left = 13
'3.為Click事件註冊
AddHandler btuArray(i).Click, AddressOf button_Click
i += 1
End While
End Sub
Private Sub button_Click(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine(sender.ToString())
Console.WriteLine(DirectCast((sender), Button).Text)
Console.WriteLine(DirectCast((sender), Button).TabIndex)
textBox1.Text = "你按下: " & DirectCast((sender), Button).Text
textBox2.Text = "索引值: " & DirectCast((sender), Button).TabIndex.ToString()
End Sub
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET