2011-04-20 84 views
0

我有一個帶有2箇中繼器的頁面,每個中繼器都包含一個用戶控件。將數據綁定到中繼器,通過另一箇中繼器中的用戶控件單擊按鈕

想法是,當您單擊左側中繼器中的usercontrol上的按鈕時,將從數據庫中檢索數據並將其設置爲右側中繼器的數據源。 我使用事件冒泡將事件從用戶控件傳遞到頁面,以便我可以獲取數據並將其設置爲其他中繼器。

我的問題是,在用戶控件按鈕事件頁面的事件處理程序中設置中繼器源後,不會再次調用ItemDataBound事件處理程序。

這裏的頁面

<div id="leftDiv"> 
    <asp:Repeater ID="rptUser" runat="server"> 
     <ItemTemplate> 
      <custom:UserInfo ID="cstUserInfo" runat="server" /> 
      <br /> 
     </ItemTemplate> 
    </asp:Repeater> 
</div> 
<div id="rightDiv"> 
    <asp:Repeater ID="rptMessages" runat="server"> 
     <ItemTemplate> 
      <custom:MessageDetails ID="cstMessageDetails" runat="server" /> 
     </ItemTemplate> 
    </asp:Repeater> 
</div> 

的佈局,這裏的用戶控件按鈕單擊事件的事件處理程序。

private void cstUserInfo_ShowMessagesClicked(object sender, EventArgs e) 
{ 
    UserInfoControl userInfoControl = sender as UserInfoControl; 
    //Get the messages 
    messageManager = new MessageManager(); 
    List<Messages> messages = messageManager.GetMessageDetailsByUserId(userInfoControl.CurrentUser.Id).ToList(); 

    rptTimeline.DataSource = messages; 
    rptTimeline.ItemDataBound += new RepeaterItemEventHandler(rptMessages_ItemDataBound); 
    rptTimeline.DataBind(); 
} 

當我點擊用戶控件將出現以下情況的按鈕:

  1. 的頁面執行,這臺第二中繼
  2. 的的ItemDataBound處理程序中繼器的默認源的Page_Load執行該操作,用數據設置用戶控件的屬性
  3. 用戶控件的Page_Load執行該控件,該控件使用其屬性值在用戶控件上設置標籤。
  4. 事件處理程序cstUserInfo_ShowMessagesClicked,設置一個新的數據源的中繼器執行
  5. 用戶控制的Page_Load中再次執行,並因爲屬性沒有被設定

拋出一個異常,有沒有綁定任何方式當第一個轉發器中的用戶控制按鈕被按下時,新的數據被傳送到第二個轉發器?

回答

1

你會想使用ItemCreated。

repeater.ItemCreated += new ItemCreatedEventHandler() 

它每次創建一個項目被綁定到中繼器時被調用。

+0

我剛剛測試過它,它的工作原理。 ItemCreated事件在用戶控件的頁面加載之前觸發,而ItemDatabound在之後觸發。我會閱讀這兩者之間的區別,謝謝! – Freek 2011-04-21 10:57:08

相關問題