4

我有一个加载自定义用户控件的 Sharepoint WebPart。用户控件包含一个Repeater,而Repeater 又包含几个LinkBut​​tons。

在 Webpart 的 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 永远不会被调用。但是,我可以看到它被添加为调试器中的事件处理程序。

有任何想法吗?我很难过如何做到这一点。

4

6 回答 6

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
    }                          
 }
于 2008-09-23T18:44:14.383 回答
2

您是否尝试在迭代时将 CommandName 和 CommandArgument 属性分配给每个按钮?Repeater 控件支持 ItemCommand 事件,该事件将在点击具有 CommandName 属性的控件时引发。

从那里处理起来很容易,因为 CommandName 和 CommandArgument 值被传递到事件中并且很容易访问。

于 2008-09-23T18:32:23.477 回答
1

您需要确保将链接按钮重新添加到控件树和/或在事件触发之前将事件重新连接到控件。

文章@4guysfromrolla

于 2008-09-23T18:29:47.447 回答
1

我从未做过 SharePoint WebPart,所以我不知道这是否适用。但如果它是一个普通的 apsx 页面,我会说当它呈现时,为时已晚。尝试在控件的 Init 或 PreInit 事件中添加事件处理程序。


编辑:等等,我认为 Dilli-O 可能是对的。请参阅http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html末尾的向中继器添加按钮控件部分。它在 VB.NET 中,但您可以在 C# 中轻松地做同样的事情。

于 2008-09-23T18:31:24.633 回答
1

正如其他人指出的那样,您在页面生命周期中添加事件处理程序为时已晚。对于 SharePoint WebParts,您通常希望重写类的 OnInit/CreateChildControls 方法来处理活动。

于 2008-09-23T22:38:18.033 回答
1

你需要你的 webpart 来实现INamingContainer标记接口,框架使用它来允许回发返回到正确的控件......而且你的 webpart 中的控件都需要有一个 ID。

于 2009-08-26T15:35:47.967 回答