[C#.NET][VB.NET] 如何設定 控制項陣列 / 動態加入控制項

  • 93669
  • 0
  • C#
  • 2009-06-11

[C#.NET][VB.NET] 如何設定 控制項陣列 / 動態加入控制項

在以前VB6時代常在用控制項陣列,只要屬性是相同的Name,再設定Index,就能簡單的使用陣列控制項,不過到了.NET之後卻變的有點不太一樣了。

用控制項陣列的好處就是可以省下不少重複的原始碼。

快照-20096153732_thumb[5]快照-20096153844_thumb[3]

 

 如何在.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);

快照-20096111338_thumb[3]

7.在VB,就比C#簡單多了,我們可以觀察到事件是由 Handles(VB已經幫我們處理好事件,變成Handles) 傳入至sender,或者你也可以在 Handles 後面手動加入要處理的方法(button1.Click, button2.Click, button3.Click),就可以省去上述的動作(拖曳)。

8.預設的控制項都是藉由sender參數來傳遞事件,所以我們可以用它來偵測哪一個按鈕被按下,我們可以設定中斷點觀察一下sender的狀態。

快照-20096162614_thumb[3]

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

 

快照-200961114510_thumb[1]

範例下載:

DynamicControl.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo