首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 動態建立控制項與事件繫結:WinForms、ASP.NET WebForms 與 AjaxControlToolkit 完整實戰

     編輯:關於C#

WinForms 動態按鈕與事件

private int btnIndex = 0;

private void btnCreate_Click(object sender, EventArgs e)
{
    btnIndex++;
    var btn = new Button
    {
        Name = $"btnDynamic_{btnIndex}",
        Text = $"動態按鈕 {btnIndex}",
        Location = new Point(12, 13 + btnIndex * 30)
    };
    panel1.Controls.Add(btn);
    btn.Click += BtnDynamic_Click; // 繫結同一處理器
}

private void BtnDynamic_Click(object sender, EventArgs e)
{
    var btn = (Button)sender;
    MessageBox.Show($"你點擊了 {btn.Name}");
}

ASP.NET WebForms 動態控制項關鍵:Page_Init vs Page_Load

絕對不可放在 if (!IsPostBack) 區塊,否則 PostBack 時控制項不存在,事件不觸發。

方式一:ParseControl 從字串建立

protected void Page_Load(object sender, EventArgs e)
{
    var c = ParseControl(@"");
    Panel1.Controls.Add(c);

    var btn = (Button)Page.FindControl("myButton");
    btn.Command += OnButtonCommand;
}

protected void OnButtonCommand(object sender, CommandEventArgs e)
{
    Response.Write($"");
}

方式二:程式碼建立並繫結

private void Page_Load(object sender, EventArgs e)
{
    var b1 = new Button { ID = "Btn1", Text = "Btn1", CommandArgument = "b1" };
    b1.Command += OnButton;
    PlaceHolder1.Controls.Add(b1);

    var b2 = new Button { ID = "Btn2", Text = "Btn2", CommandArgument = "b2" };
    b2.Command += OnButton;
    PlaceHolder1.Controls.Add(b2);

    // ParseControl 建立後需 FindControl 再繫結
    var c3 = ParseControl(@"");
    PlaceHolder1.Controls.Add(c3);
    ((Button)Page.FindControl("Button3")).Command += OnButton;
}

public void OnButton(object sender, CommandEventArgs e)
{
    switch (e.CommandArgument.ToString().ToLower())
    {
        case "b1": Label1.Text = "Button 1"; break;
        case "b2": Label1.Text = "Button 2"; break;
        case "b3": Label1.Text = "Button 3"; break;
    }
}

AjaxControlToolkit TabContainer 動態建立與 ContentTemplate

關鍵:TabPanel.ContentTemplate 型別為 ITemplate,需自行實作:

public class TabContentTemplate : ITemplate
{
    private Control _template;
    public void SetTemplate(Control c) => _template = c;
    public void InstantiateIn(Control container) => container.Controls.Add(_template);
}

// 使用
protected void Page_Load(object sender, EventArgs e)
{
    var tabContainer = new TabContainer();
    var tab1 = new TabPanel { HeaderText = "標籤1" };
    var tab2 = new TabPanel { HeaderText = "標籤2" };
    tabContainer.Tabs.Add(tab1);
    tabContainer.Tabs.Add(tab2);

    var panel = new Panel();
    panel.Controls.Add(new Label { Text = "這是第一個 Tab" });

    var template = new TabContentTemplate();
    template.SetTemplate(panel);
    tab1.ContentTemplate = template;

    form1.Controls.Add(tabContainer);
}

替代方案:tab1.ContentTemplate = Page.LoadTemplate("Template.ascx"); 從 `.ascx` 載入。GridView/Repeater 等模板控制項同理。

專案經驗補充

  • 動態建立 TabPanel/GridView 易導致其他按鈕失效 → 改放 Page_Init 解決
  • Ajax 控制項同樣建議在 Page_Init 建立
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved