ASP.NET - добавить обработчик событий в LinkButton внутри ретранслятора в вызове RenderContent


4

У меня есть веб-страница Sharepoint, которая загружает пользовательский элемент управления пользователя. Пользовательский элемент управления содержит ретранслятор, который, в свою очередь, содержит несколько кнопок LinkButtons.

В RenderContent вызове в WebPart я получил некоторый код для добавления обработчиков событий:

 ArrayList nextPages = new ArrayList(); 
     //populate nextPages .... 
     AfterPageRepeater.DataSource = nextPages; 
     AfterPageRepeater.DataBind(); 

     foreach (Control oRepeaterControl in AfterPageRepeater.Controls) 
     { 
      if (oRepeaterControl is RepeaterItem) 
      { 
       if (oRepeaterControl.HasControls()) 
       { 
        foreach (Control oControl in oRepeaterControl.Controls) 
        { 
         if (oControl is LinkButton) 
         { 
          ((LinkButton)oControl).Click += new EventHandler(PageNavigateButton_Click); 
         } 
        } 
       } 
      } 
     } 

Функция PageNavigateButton_Click никогда не вызывается, однако. Я вижу, что он добавляется как обработчик событий в отладчике.

Любые идеи? Я в тупике, как это сделать.

  0

Я немного испортил код, прочитав предложения людей. Я пытаюсь добавить обработчики событий в функцию CreateChildControls(), но они все еще не запущены. Спасибо за всю помощь до сих пор, это оценено 24 сен. 082008-09-24 15:49:16

+1

Для тех, кто видит это в конце игры. Не используйте CreateChildControls ... Это еще слишком поздно в цикле. Вместо этого переопределите обработчик OnInit для создания всех ваших динамических элементов управления. 03 сен. 092009-09-03 01:51:45

6

К тому времени, когда вызывается RenderContent(), все зарегистрированные обработчики событий были вызваны каркасом. Вам нужно добавить обработчики событий в более раннем способе, как OnLoad():

protected override void OnLoad(EventArge e) 
{ base.OnLoad(e); 
    EnsureChildControls(); 

    var linkButtons = from c in AfterPageRepeater.Controls 
               .OfType<RepeaterItem>() 
        where c.HasControls() 
        select c into ris 
         from lb in ris.OfType<LinkButton>() 
         select lb; 

    foreach(var linkButton in linkButtons) 
    { linkButton.Click += PageNavigateButton_Click 
    }       
} 
  0

Я пробовал поместив код, который добавляет обработчики событий в методе CreateChildControls(), чтобы теперь воспользоваться. благодаря 24 сен. 082008-09-24 15:46:32


1

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

Article @ 4guysfromrolla


1

Я никогда не делал SharePoint WebPart, поэтому я не знаю, если это будет применяться. Но если бы это была простая страница apsx, я бы сказал, что к моменту ее рендеринга уже слишком поздно. Попробуйте добавить обработчики событий в события Init или PreInit элемента управления.


Edit: Подождите, я думаю, Дилли-O может быть правильным. См. Добавление кнопок управления в ретранслятор в конце http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html. Это в VB.NET, но вы можете легко сделать то же самое в C#.


2

Вы пытались присвоить свойствам CommandName и CommandArgument каждой кнопке при повторном прохождении? Элемент управления Repeater поддерживает событие ItemCommand, которое является событием, которое будет возникать при ударе элемента управления с свойством CommandName.

Оттуда легко обрабатывать, поскольку значения CommandName и CommandArgument передаются в событие и легко доступны.

  0

Gordon, выезд: http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 23 сен. 082008-09-23 18:48:45

  0

Я пробовал это, но события все еще не увольняются 24 сен. 082008-09-24 15:47:38


1

Как уже отмечалось, вы добавляете обработчик событий слишком поздно в жизненном цикле страницы. Для веб-страниц SharePoint вы обычно должны переопределять методы OnInit/CreateChildControls класса для обработки этого действия.


1

вам нужен веб-части для реализации интерфейса INamingContainer маркера, он используется рамкой, чтобы позволить постбэки вернуться на правильный контроль ... Также элементы управления в вашем веб-части все должны иметь удостоверение личности.