如何在 C# 中动态创建按钮并单击另一个按钮?然后让这些按钮也做同样的事情

本文关键字:按钮 然后 动态 创建 另一个 单击 | 更新日期: 2023-09-27 17:57:15

我正在尝试制作一个 C# 网页,该网页根据表单提交的内容动态创建按钮,但我一直跑到死胡同。 问题是(显然?)您只能在Page_Load期间挂接事件处理程序,而不能在按钮的 Click 事件中挂接?

基本上我有一些代码来创建按钮:

private Button CreateButton(string id, string text) {
    Button b = new Button();
    b.ID = id;
    b.Text = text;
    b.Command += new CommandEventHandler(Button_Command);
    b.CommandArgument = text;
    return b;
}

当单击这些新按钮时,它们应该传递命令参数,并根据这些命令参数创建新按钮。

void Button_Command(object sender, CommandEventArgs e) {
    //Put code here that creates new buttons based on what's submitted
    DoThis(e.CommandArgument.ToString());
}

但是,当我在按钮的 Click 事件中运行此代码时,新创建的按钮的事件处理程序不会挂接。

第一次点击页面时只有一个文本输入和一个 GO 按钮。 它应该创建一堆新按钮及其命令参数:

protected void bntGo_Click(object sender, e EventArgs){
    DoThis(txtInput.Text);
}
private void DoThis(string arg){
    //Do some logic to create a Dictionary<string, int> object (sortedDict) 
    //based on the arg passed, then for each KeyValuePair in the Dictionary, 
    //add a button to a panel on the page, setting each button's commandarguments 
    //to each string in the dictionary
    int count=1;
    foreach (KeyValuePair<string, int> pair in sortedDict) {
        pnlButtonsPanel.Controls.Add(CreateButton("Btn"+count.ToString(), pair.Key));
    }
}

我该如何实现此目的? 我不能每次加载页面时都运行 DoThis() 函数,因为 DoThis() 需要从他们单击的按钮传递 CommandArguments,这在 page_load 中不可用。

我做错了什么? 我需要一种新的方法。 我在这里想自己在兜圈子。

谢谢!

如何在 C# 中动态创建按钮并单击另一个按钮?然后让这些按钮也做同样的事情

您不能注册处理程序,您必须实际提交表单并解析服务器上命令的字符串等效项。因此,RunAt Server。呈现的页面和服务器之间没有神奇的连接,这称为Javascript。

您是否遵循了这里的设计模式?

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.commandeventhandler.aspx

  <asp:Button id="Button1"
       Text="Sort Ascending"
       CommandName="Sort"
       CommandArgument="Ascending"
       OnCommand="CommandBtn_Click" 
       runat="server"/>

void CommandBtn_Click(Object sender, CommandEventArgs e) 
      {
         switch(e.CommandName)
         {
            case "Sort":
               // Call the method to sort the list.
               Sort_List((String)e.CommandArgument);
               break;

需要在 Page_Init 或 Page_Load 中添加事件处理程序的原因如下:

每次回发到服务器都会导致从头开始重建页面(除非它是一个完全静态的页面并且它被缓存)。这会导致所有动态更改(添加按钮等)丢失。因此,当您单击动态创建的按钮,并且出于所有意图和目的而不在Page_Init或Page_Load中重新创建按钮和所有处理程序时,该按钮不存在服务器端。


编辑:

如果您需要保存包含每个按钮详细信息的列表,只需使用ViewState

protected void Page_Init (object sender, EventArgs e)
{
    //do your stuff
    var buttonStuff = ViewState["MySaveButtonStuff"] as List<string>;
    if (buttonStuff != null)
    {
        //create button method(s)
    }
}
相关文章: