【问题标题】:Dynamically adding a commandbutton in ASP.NET在 ASP.NET 中动态添加命令按钮
【发布时间】:2011-07-27 23:38:05
【问题描述】:

我有一个带有动态创建的命令按钮的页面。

我需要动态连接一个点击事件,以便我可以获取点击按钮的 CommandArgument。

Button b = new Button();
b.ID = "btnTrigger2";
b.CssClass = "hiddenBtn";
b.CommandName = "lbl3";
b.Click += new EventHandler(btnTrigger_Click);

问题出在最后一行 - 我无法以这种方式连接 EventHandler - 我需要使用标准 EventArgs 而不是 CommandEventArgs。

任何人对让它工作有什么建议吗?一定有办法……

编辑

我想我会发布最终有效的代码,以防其他人尝试做同样的事情。

`string tabLoadedScript = string.Empty; string postBackScript = string.Empty;

string script = " <script language='javascript' type='text/javascript'>" + System.Environment.NewLine;
script += "function clientActiveTabChanged(sender, args) {" + System.Environment.NewLine;


int i = 0;

foreach(TabPanel tp in tc1.Tabs)
    {
    Button b = new Button();
    b.ID = "btn" + tp.ClientID;
    b.CssClass = "hiddenBtn";
    b.CommandName = tp.ID;
    b.Command += btnTrigger_Click;
    this.form1.Controls.Add(b);
    AsyncPostBackTrigger trg = new AsyncPostBackTrigger();
    trg.ControlID = "btn" + tp.ClientID;

    tabLoadedScript += "var isTab" + tp.ClientID + "loaded=$get('" + tp.Controls[0].ClientID + "');" + System.Environment.NewLine;
    postBackScript += "if(!isTab" + tp.ClientID + "loaded && sender.get_activeTabIndex() == " + i + ") {" + System.Environment.NewLine;
    postBackScript += "__doPostBack('" + b.ClientID + "','');}" + System.Environment.NewLine;
    i++;
    }
script += tabLoadedScript;
script += postBackScript;
script += "}" + System.Environment.NewLine;
script += "</script>";

this.ClientScript.RegisterClientScriptBlock(this.GetType(), "cs", script, false);

protected void btnTrigger_Click(object sender, CommandEventArgs e) { System.Threading.Thread.Sleep(2500); 面板 ctrl = (面板) FindControlRecursive(this, "pnl" + e.CommandName); ctrl.Visible = true; }

public static Control FindControlRecursive(Control Root, string Id)
    {

    if(Root.ID == Id)
        return Root;

    foreach(Control Ctl in Root.Controls)
        {

        Control FoundCtl = FindControlRecursive(Ctl, Id);
        if(FoundCtl != null)
        return FoundCtl;

        }
    return null;

    }

`

【问题讨论】:

    标签: asp.net dynamic button command arguments


    【解决方案1】:

    您仍然可以使用传递给点击处理程序的第一个参数来访问 CommandArgument。

    类似:

    protected void btnTrigger_Click(object sender, EventArgs e)
    {
      Button btnTrigger = sender as Button;
      String commandArgument = btnTrigger.CommandArgument;
      .
      .
      .
      .
      //Other code....
    
    }
    

    【讨论】:

    • 感谢两位的回复! \
    【解决方案2】:

    您需要使用 Command 事件而不是 Click 事件。此外,假设您使用的是最新版本的 Visual Studio 和 .Net,您可以简单地从

    更改事件注册
    b.Click += new EventHandler(btnTrigger_Click);
    

    b.Command += btnTrigger_Click
    

    委托的显式类型是多余的,将由编译器推断。您现在可以将事件处理程序的签名更改为:

    protected void btnTrigger_Click(object sender, CommandEventArgs e)
    

    并且代码应该可以正常工作。

    很遗憾,Visual Studio 中的默认代码 sn-ps 仍然会生成这种旧式事件侦听器代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 2010-12-19
      • 2021-11-28
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      相关资源
      最近更新 更多