如何在动态加载的UserControl中从Event触发UpdatePanel?

时间:2011-06-30 09:28:09

标签: c# asp.net asp.net-ajax updatepanel

我正在使用Ajax,c#和.NET 3.5编写一个纸牌游戏应用程序。由于界面的性质,我有许多更新面板,我试图管理和更新各种用户操作。我虽然遇到了问题。

通过将Card对象列表绑定到转发器然后动态创建Card UserControl并在每个项目都是数据绑定时将其添加到PlaceHolder的控件中来构建玩家当前指针。代码大致如下:

在页面上

<asp:UpdatePanel ID="pnlInHand" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Repeater ID="rptInHand" runat="server" onitemdatabound="rptInHand_ItemDataBound">
            <ItemTemplate>
                <asp:PlaceHolder ID="plcInHandCard" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

在代码背后

protected void rptInHand_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   Card card = (Card)e.Item.DataItem;
   PlaceHolder plcCard = (PlaceHolder)e.Item.FindControl("plcInHandCard");
   plcCard.Controls.Add(CreateCardControl());
}

private CardControl CreateCardControl()
{           
   CardControl cardControl = (CardControl)Page.LoadControl("~/UserControls/CardControl.ascx");
   //Set control properties here
   return cardControl;
}

卡片控制包括一个按钮。此按钮的ClickEvent调用父页面的方法,该方法需要更新单独的UpdatePanel,并从面板中删除卡片控件。

我有两个问题。

  1. 当我单击“卡控制”按钮时,因为它已在updatePanel中创建为转发器的一部分,所以当页面回发时它不再存在,因此控件中的按钮的Click事件永远不会存在火灾。我显然可以在页面加载时重新绑定转发器,但这是否意味着我必须在每次回发时基本上执行此操作?

  2. 更重要的是,当引发Card控件的click事件时,我需要一种方法来触发父页面中另一个updatepanel的更新。有没有办法在更新面板上设置一个触发器来监听动态加载的UserControl中的事件?

  3. 非常感谢

    斯图尔特

3 个答案:

答案 0 :(得分:1)

来自ASP.net网站的示例代码应该解决您的第2点问题。

我会将翻译留给您的代码。

我可能误解了你想要做的事情,但我相信一旦你完成这项工作你的问题就不再那么重要了,因为你将从你的父更新面板获得你想要的AJAX回发。

祝你好运!

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate>
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"  OnItemDataBound="itemDataBound">
        <ItemTemplate>       

          <mycontrol:user ID="user1" runat="server" OnCausePostBack="user1_CausePostBack"  /> <br />
    </ItemTemplate>
    </asp:Repeater>
</ContentTemplate>

</asp:UpdatePanel>



protected void itemDataBound(object sender, RepeaterItemEventArgs e)
{
    ModalPopup_WebUserControl mw=(ModalPopup_WebUserControl)e.Item.FindControl("user1");
    AsyncPostBackTrigger at = new AsyncPostBackTrigger();
    at.ControlID = mw.ID;
    at.EventName = "CausePostBack";
    UpdatePanel2.Triggers.Add(at);
}
protected void user1_CausePostBack(object sender, EventArgs e)
{
   // do something
}

答案 1 :(得分:0)

只是第2点的想法:如何在cardControl中添加属性来设置对updatepanel / s的引用?从那里你可以添加触发器或在按钮事件中调用panel.update

答案 2 :(得分:0)

对于第一点,是的,你必须这样做。你将不得不重新创建控件 对于第2点,如果您使用绑定到动态创建的控件的事件,则简单的updatePanel.update()将执行任何事件的作业insode,然后您将不得不在每个页面回发时重新绑定事件