繁体   English   中英

ASP.NET - 在RenderContent调用中将事件处理程序添加到Repeater内部的LinkBut​​ton

[英]ASP.NET - Add Event Handler to LinkButton inside of Repeater in a RenderContent call

我有一个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。 我可以看到它被添加为调试器中的事件处理程序。

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

调用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
    }                          
 }

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

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

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

文章@ 4guysfromrolla

我从来没有做过SharePoint WebPart,所以我不知道这是否适用。 但如果它是一个普通的apsx页面,我会说它在渲染时,已经太晚了。 尝试在控件的Init或PreInit事件中添加事件处理程序。


编辑:等等,我认为Dilli-O可能是对的。 请参阅http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html末尾的“ 将按钮控件添加到转发器”部分。 它在VB.NET中,但您可以轻松地在C#中执行相同的操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM