如何动态添加ASP.NET按钮以触发事件?

如何动态添加ASP.NET按钮以触发事件?,asp.net,Asp.net,这可能是一个简单的问题,但我不是一个ASP.NET开发人员,我被卡住了 我有一个简单的搜索例程,返回0到几百个结果。其中的每一个都必须作为按钮添加到页面中,我想设置按钮的文本和CommandArgument属性,以便在单击按钮时可以读回CommandArgument并做出相应的反应 但是,当我单击按钮时,事件根本不会运行。我怎样才能让它运行 构建按钮列表的代码(为便于阅读而简化)如下所示: foreach (SearchResult sr in searchResults) {

这可能是一个简单的问题,但我不是一个ASP.NET开发人员,我被卡住了

我有一个简单的搜索例程,返回0到几百个结果。其中的每一个都必须作为按钮添加到页面中,我想设置按钮的文本和CommandArgument属性,以便在单击按钮时可以读回CommandArgument并做出相应的反应

但是,当我单击按钮时,事件根本不会运行。我怎样才能让它运行

构建按钮列表的代码(为便于阅读而简化)如下所示:

    foreach (SearchResult sr in searchResults)
    {
        Button result = new Button();
        result.Text = sr.name;
        result.CommandArgument = sr.ID.ToString();
        AccountSearchResults.Controls.Add(result);
        result.Click += new EventHandler(SearchResultClicked);
        AccountSearchResults.Controls.Add(new LiteralControl("<br/>"));
    }

我认为您需要使用OnCommand事件处理程序,而不是OnClick,即尝试更改以下内容:

result.Click += new EventHandler(SearchResultClicked);
为此:

result.Command += new EventHandler(SearchResultClicked);
更新 尝试将事件处理程序的第二个参数类型从EventArgs更改为CommandEventArgs。您可能还必须在按钮上设置CommandName属性,即

result.CommandName = "foo";

你在哪里添加这些按钮


如果将它们添加到另一个控件中,则事件可能会在父控件中引发。例如,这种情况发生在DataRepeater和DataGrids上。

您在另一个回答中提到,单击按钮时添加这些。查看您的代码,我建议您尝试为添加的每个按钮设置一个唯一的ID,然后确保在加载页面时重新加载具有相同ID和CommandArgument值的按钮。单击动态加载的按钮时,该按钮在回发后必须仍存在于页面上,才能触发事件


我认为ID是您所需要的全部,再加上您对CommandArgument的要求)。如果没有长时间的搜索过程就无法重复ID信息,则可以将其置于ViewState中。

它们被添加到一个通常隐藏(可见性:隐藏)的div中,并且只有在单击按钮时才会显示……尽管我还必须重新添加事件处理程序。
result.CommandName = "foo";