onClick для динамически сгенерированной кнопки ссылки

#c# #asp.net #visual-studio #event-handling #linkbutton

#c# #asp.net #visual-studio #обработка событий #кнопка linkbutton

Вопрос:

В моем приложении веб-части sharepoint. Я динамически генерирую кнопки ссылок, как показано ниже. и это работает нормально

 foreach (var pName in productTypesNames[productType] )
{
   var subLi = new HtmlGenericControl("li");
   var linkButton = new LinkButton{ Text = pName };
   linkButton.Click  = new EventHandler(linkButton_Click);
   subLi.Controls.Add(linkButton);
   ul.Controls.Add(subLi);
}
  

Однако, когда я нажимаю на одну из ссылок в пользовательском интерфейсе, мой отладчик никогда не достигает точки останова, установленной в самой первой строке

 void linkButton_Click(object sender, EventArgs e)
{
}
  

Больше кода

 protected void StateClicked(object sender, CommandEventArgs e)
{
  //Generate a dictionary of type Dictionary<string, List<string>>
  //Display the dictionary
  foreach (var productType in productTypesNames.Keys)
        {
            var li = new HtmlGenericControl("li");
            nav.Controls.Add(li);
            var ul = new HtmlGenericControl("ul");

            var anchor = new HtmlGenericControl("a");
            anchor.Attributes.Add("href", "#");

            foreach (var pName in productTypesNames[productType] )
            {
                var subLi = new HtmlGenericControl("li");
                var linkButton = new LinkButton{ Text = pName };
                linkButton.Click  = new EventHandler(linkButton_Click);
                subLi.Controls.Add(linkButton);
                ul.Controls.Add(subLi);
            }
            anchor.InnerHtml = productType;
            li.Controls.Add(anchor);
            li.Controls.Add(ul);
        }
 }
  

Где stateClicked вызывается щелчком мыши на изображении карты США.

Комментарии:

1. Для этого может быть несколько причин, требуется больше кода, наиболее вероятными причинами могут быть AutoEventWireup=»false» или отсутствие runat=»Server» на кнопках LinkButtons.

2. Я добавил следующий код, и он мне все еще не нравится:-(

3. Кнопка LinkButton. Атрибуты. Добавить(«runat», «server»); Кнопка LinkButton. Атрибуты. Добавить(«AutoEventWireup», «true»); Кнопка LinkButton. Атрибуты. Добавить(«AutoPostBack», «true»); LinkButton.Click = новый обработчик событий(linkButton_Click);

4. Также это приложение веб-части Sharepoint

5. Убедитесь, что ваши элементы управления воссоздаются при каждой обратной передаче, иначе событие не будет подключено должным образом. Если вы создаете эти элементы управления только с помощью onclick, убедитесь, что вы воссоздали их где-то еще, например, page_init

Ответ №1:

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

Если у вас есть if (!IsPostback) обернутый вокруг вашего foreach, попробуйте удалить его.

Комментарии:

1. У меня нет if (!IsPostBack), обернутого вокруг моего foreach 🙁

2. Можете ли вы опубликовать больше кода? Он отлично работает, если я скопирую ваш код непосредственно в свой проект. Единственный способ воспроизвести это, если я не буду повторно создавать ссылки при обратной передаче

3. Хорошо, так вызывается ли StateClicked когда-нибудь во время обратной передачи? Вероятно, все еще потребуется больше кода, чтобы полностью решить эту проблему. Также смотрите комментарий @CjCoax относительно AutoEventWireup

4. Да, и нигде нет проверки (!IsPostBack). Я добавил в LinkButton следующие атрибуты. Кнопка LinkButton. Атрибуты. Добавить(«runat», «server»); Кнопка LinkButton. Атрибуты. Добавить(«AutoEventWireup», «true»); Кнопка LinkButton. Атрибуты. Добавить(«AutoPostBack», «true»); LinkButton.Click = новый обработчик событий(linkButton_Click);

Ответ №2:

здесь у меня была та же проблема….

я создавал HtmlTable после запуска события … в этой таблице (n) HtmlTableRow s (вычисляется в обработчике событий)
, теперь каждая строка содержит 2 LinkButton s, которые генерируются из исходного кода .. после обработки события … и каждому LinkButton присваивается новый обработчик событий:

lnkbtnEdit.CommandArgument = b.BookID.ToString();
lnkbtnEdit.Click = new EventHandler(lnkbtnEdit_Click);

где lnkbtnEdit_Click подпись выглядит следующим образом:
protected void lnkbtnEdit_Click(object sender, EventArgs e)

странно то, что .. при нажатии сгенерированного происходит обратная LinkButton передача… но событие не было запущено…

я точно не знаю, в чем была проблема… но я нашел решение: ..
похоже, что эти сгенерированные элементы управления исчезают при обратной передаче (пытался присвоить идентификатор и использовал Page.FindControl() witch, возвращенный с null !!)
поэтому мне пришлось заново связать кнопки …. на Page_Load я повторно сгенерировал кнопки LinkButtons с тем же идентификатором … и связал их с соответствующими EventHandler s