【问题标题】:How do I create buttons dynamically in C# onClick of another button? And then have those buttons also do the same如何在另一个按钮的 C# onClick 中动态创建按钮?然后让这些按钮也做同样的事情
【发布时间】:2013-01-18 21:32:50
【问题描述】:

我正在尝试制作一个 C# 网页,该网页根据表单提交的内容动态创建按钮,但我一直跑到死胡同。问题是(显然?)您只能在 Page_Load 期间连接 EventHandlers,而不是在按钮的 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 事件中运行此代码时,新创建的按钮的 EventHandler 不会被连接起来。

第一次点击页面时,只有一个文本输入和一个 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# asp.net button dynamic onclick


    【解决方案1】:

    您不能注册处理程序,您必须实际提交表单并解析与服务器上的命令等效的字符串。因此,RunAt 服务器。呈现的页面和服务器之间没有神奇的连接,这就是所谓的 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;
    

    【讨论】:

      【解决方案2】:

      需要在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)
          }
      }
      

      【讨论】:

      • 但是我需要根据点击时发生的代码来确定新按钮的数量以及它们的命令参数是什么。也许有一种方法可以访问哪个按钮被按下,它是 page_load 或 page_init 内的命令参数? ://
      • @CharlieK 看看这是否符合您的要求。
      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多