在另一个转发器中的用户控件上单击按钮时将数据绑定到转发器

时间:2011-04-20 21:13:03

标签: c# asp.net user-controls repeater

我有一个带有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. 执行页面的Page_Load,设置第二个转发器的默认来源
  2. 执行转发器的ItemDataBound处理程序,该处理程序使用数据
  3. 设置用户控件的属性
  4. 执行用户控件的Page_Load,使用其属性值设置用户控件上的标签。
  5. 执行事件处理程序cstUserInfo_ShowMessagesClicked,为转发器设置新的数据源
  6. 再次执行用户控件的Page_load并抛出异常,因为尚未设置属性
  7. 当按下第一个转发器中用户控件上的按钮时,有没有办法将新数据绑定到第二个转发器?

1 个答案:

答案 0 :(得分:1)

你想要使用ItemCreated。

repeater.ItemCreated += new ItemCreatedEventHandler()

每次创建项目以绑定到转发器时都会调用它。