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

时间:2008-12-10 10:55:06

标签: asp.net

这可能是一个简单的问题,但我不是ASP.NET开发人员,而且我很困难。

我有一个简单的搜索例程,它返回零到几百个结果。其中每个都必须作为按钮添加到页面中,我想设置按钮的文本和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/>"));
    }

在测试的那一刻,我在表单上弹出一个标签,将CommandArgument放入。但这段代码从未执行过。

   void SearchResultClicked(object sender, EventArgs e)
    {
        Label1.Text = ((Button)sender).CommandArgument;
    }

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

result.Click += new EventHandler(SearchResultClicked);

到此:

result.Command += new EventHandler(SearchResultClicked);

更新

尝试将事件处理程序的第二个参数类型从 EventArgs 更改为 CommandEventArgs 。您可能还需要在按钮上设置CommandName属性,即

result.CommandName = "foo";

答案 2 :(得分:0)

你在哪里添加这个按钮?

如果要在另一个控件中添加它们,那么事件可能会在父控件中引发。例如,在DataRepeaters和DataGrids上会发生这种情况。