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


4

我有一个加载自定义用户控件的Sharepoint WebPart。用户控件包含一个Repeater,该Repeater包含多个LinkBut​​ton。

在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 9月. 082008-09-24 15:49:16

+1

对于那些在比赛中看到这一点。不要使用CreateChildControls ...这在循环中还为时过晚。而是重写OnInit处理程序来构建所有动态控件。 03 9月. 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 9月. 082008-09-24 15:46:32


1

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

Article @ 4guysfromrolla


1

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


编辑:等待,我想Dilli-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

戈登,检查:http://www.ondotnet.com/pub/a/dotnet/2003/03/03/repeater.html 23 9月. 082008-09-23 18:48:45

  0

我试过了,但事件仍然没有被解雇 24 9月. 082008-09-24 15:47:38


1

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


1

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