Как получить динамически добавленные кнопки 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;
    }
10.12.2008 10:55:06
3 ОТВЕТА
РЕШЕНИЕ

В другом ответе вы упомянули, что добавляете их при нажатии кнопки. Глядя на ваш код, я бы посоветовал вам попробовать установить уникальный идентификатор для каждой добавленной кнопки, а затем убедиться, что при загрузке страницы кнопки с одинаковыми идентификаторами и значениями CommandArgument перезагружаются. При нажатии динамически загруженной кнопки она должна существовать на странице после обратной передачи, чтобы событие сработало.

Я думаю, ID это все, что вам нужно, плюс ваше требование для CommandArgument). Вы можете поместить информацию об идентификаторе в ViewState, если вы не можете повторить ее без длительного процесса поиска.

1
10.12.2008 11:18:40
... хотя мне также пришлось заново добавить обработчик событий.
Baffled by ASP.NET 10.12.2008 11:26:44

Я думаю, что вам нужно использовать обработчик событий OnCommand, а не OnClick, т.е. попробуйте изменить это:

result.Click += new EventHandler(SearchResultClicked);

к этому:

result.Command += new EventHandler(SearchResultClicked);

ОБНОВИТЬ

Попробуйте изменить тип второго аргумента для обработчика событий с EventArgs на CommandEventArgs . Вам также может потребоваться установить свойство CommandName для вашей кнопки, т.е.

result.CommandName = "foo";
0
10.12.2008 11:16:11

Где вы добавляете эти кнопки?

если вы добавляете их в другой элемент управления, то событие может возникать в родительском элементе управления. Это происходит, например, в DataRepeaters и DataGrids.

0
10.12.2008 11:11:13
Они добавляются в div, который обычно скрыт (видимость: скрыт) и который появляется только при нажатии кнопки.
Baffled by ASP.NET 10.12.2008 11:15:51