C#視窗程式設計中常常會需要用到動態產生UI元件,並作相應的動作。
本文講述如何動態生成UI Button並且綁定使用者Click事件。
動態產生Button
假設我們有一個Panel叫做panel_UIPanel,那麼我們要在該Panel上動態產生Button的function如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
private void DynamicGenerateButton() { // 按鈕數量計數 buttonCount = 0; // 按鈕行數計算 rowCount = 0; // 設定位置及按鈕寬高值 int LEFTANCHOR = 40; int TOPANCHOR = -20; int BTN_HEIGHT = 60; int BTN_WIDTH = 130; // 實例化按鈕 Button btn = new Button(); // 將按鈕加入Panel panel_UIPanel.Controls.Add(btn); btn.Left = LEFTANCHOR + 130 * (realDisplayBedCount % 6); // 產生10個按鈕 for (int i = 0; i < bedCount; i++) { // 每產生五個按鈕行數加一 if (buttonCount % 5 == 0) { rowCount += 1; } // 將設定值餵給該按鈕,修改UI故用Invoke控制 this.Invoke(new Action(() => { btn.Top = TOPANCHOR + 60 * rowCount; btn.Height = BTN_HEIGHT; btn.Width = BTN_WIDTH; // 加入按鈕事件 btn.Click += dynamic_Btn_Click; btn.Text = i.TiString(); } // 計算已產生數量 buttonCount += 1; } } |
加入按鈕事件
1 2 3 4 |
private void dynamic_Btn_Click(object sender, EventArgs e) { // 撰寫事件內容 } |
其中事件內容可以針對不同Button去做相對應的case行為,
像是我們可以在動態產生的時候給定Button的Tag屬性,
然後在事件的function中使用case去判斷sender的Tag屬性,
進而做不同的行為。
留言
想請問這個realDisplayBedCount是代表什麼?謝謝
HI how, 這個只是一個變數啦~ btn.Left = LEFTANCHOR + 130 * (realDisplayBedCount % 6); 就是設定button的左邊位置,每個button間隔130, 每六個一列。 realDisplayBedCount只是所有的按鈕數量。