ASP.NET - добавление обработчика событий в LinkButton внутри Repeater при вызове RenderContent - PullRequest
4 голосов
/ 23 сентября 2008

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

При вызове RenderContent в веб-части у меня есть код для добавления обработчиков событий:

        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 никогда не вызывается. Однако я вижу, что он добавлен в качестве обработчика событий в отладчике.

Есть идеи? Я в тупик, как это сделать.

Ответы [ 6 ]

6 голосов
/ 23 сентября 2008

К моменту вызова 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
    }                          
 }
2 голосов
/ 23 сентября 2008

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

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

1 голос
/ 26 августа 2009

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

1 голос
/ 24 сентября 2008

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

1 голос
/ 23 сентября 2008

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


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

1 голос
/ 23 сентября 2008

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

Артикул @ 4гуйсфромролла

...