ASP.NET - 在 RenderContent 调用中将事件处理程序添加到中继器内的 LinkButton
Posted
技术标签:
【中文标题】ASP.NET - 在 RenderContent 调用中将事件处理程序添加到中继器内的 LinkButton【英文标题】:ASP.NET - Add Event Handler to LinkButton inside of Repeater in a RenderContent call 【发布时间】:2010-09-12 11:26:35 【问题描述】:我有一个加载自定义用户控件的 Sharepoint WebPart。用户控件包含一个Repeater,而Repeater 又包含几个LinkButtons。
在 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 函数永远不会被调用。但是,我可以看到它被添加为调试器中的事件处理程序。
有什么想法吗?我很难过如何做到这一点。
【问题讨论】:
在阅读了人们的建议后,我对代码进行了一些修改。我现在正在尝试在 CreateChildControls() 函数中添加事件处理程序,但它们仍然没有被触发。感谢您迄今为止的所有帮助,不胜感激 对于那些在游戏后期看到这一点的人。不要使用 CreateChildControls ......这在周期中仍然为时已晚。而是重写 OnInit 处理程序以构建所有动态控件。 【参考方案1】:在调用 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
【讨论】:
我已经尝试将添加事件处理程序的代码放入 CreateChildControls() 方法中,以便现在可以使用。谢谢【参考方案2】:您是否尝试在迭代时将 CommandName 和 CommandArgument 属性分配给每个按钮? Repeater 控件支持 ItemCommand 事件,该事件将在点击具有 CommandName 属性的控件时引发。
从那里处理起来很容易,因为 CommandName 和 CommandArgument 值被传递到事件中并且很容易访问。
【讨论】:
【参考方案3】:您需要确保将链接按钮重新添加到控件树和/或在事件触发之前将事件重新连接到控件。
Article @ 4guysfromrolla
【讨论】:
【参考方案4】:我从未做过 SharePoint WebPart,所以我不知道这是否适用。但是,如果它是一个普通的 apsx 页面,我会说当它呈现时,为时已晚。尝试在控件的 Init 或 PreInit 事件中添加事件处理程序。
编辑:等等,我认为 Dilli-O 可能是对的。请参阅http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 末尾的将按钮控件添加到中继器部分。它在 VB.NET 中,但您可以在 C# 中轻松地做同样的事情。
【讨论】:
【参考方案5】:正如其他人所指出的,您在页面生命周期中添加事件处理程序为时已晚。对于 SharePoint WebPart,您通常希望覆盖类的 OnInit/CreateChildControls 方法来处理活动。
【讨论】:
【参考方案6】:你需要你的 webpart 来实现INamingContainer 标记接口,框架使用它来允许回发返回到正确的控制... 此外,Webpart 中的控件都需要有一个 ID。
【讨论】:
以上是关于ASP.NET - 在 RenderContent 调用中将事件处理程序添加到中继器内的 LinkButton的主要内容,如果未能解决你的问题,请参考以下文章