2008-09-23 47 views
4

我有一個加載自定義用戶控件的Sharepoint WebPart。用戶控件包含一個Repeater,該Repeater包含多個LinkBut​​ton。ASP.NET - 在RenderContent調用中將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()函數中添加事件處理程序,但它們仍未被解僱。感謝所有幫助到目前爲止,這是讚賞 – 2008-09-24 15:49:16

+1

對於那些在比賽中看到這一點。不要使用CreateChildControls ...這在循環中還爲時過晚。而是重寫OnInit處理程序來構建所有動態控件。 – NotMe 2009-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 
    }       
} 
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 – 2008-09-23 18:48:45

1

正如其他人所指出的那樣,你要添加的事件處理程序在頁面生命週期爲時已晚。對於SharePoint WebParts,通常需要重寫類OnInit/CreateChildControls方法來處理活動。

1

你需要你的webpart實現INamingContainer標記接口,它被框架用來允許回發返回到正確的控制... 另外你的webpart中的控件都需要有一個ID。

相關問題