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}");
}
絕對不可放在 if (!IsPostBack) 區塊,否則 PostBack 時控制項不存在,事件不觸發。
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;
}
}
關鍵: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 等模板控制項同理。
Page_Init 解決Page_Init 建立