如何在动态加载的UserControl中从事件触发UpdatePanel
本文关键字:事件 UpdatePanel UserControl 动态 加载 | 更新日期: 2023-09-27 18:00:58
我正在使用Ajax、c#和编写一个纸牌游戏应用程序。NET 3.5。由于界面的性质,我有许多更新面板,我试图管理和更新各种用户操作。不过我有一个问题。
玩家当前的手牌是通过将卡对象列表绑定到中继器来构建的,然后动态创建一个卡用户控件,并在每个项目都被数据绑定时将其添加到占位符的控件中。代码大致如下:
页面
<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,并从其所在的面板中删除卡控件。
我有两个问题。
当我单击卡控制按钮时,因为它是作为updatePanel中中继器的一部分创建的,所以当页面返回时,它不再存在,因此控件中按钮的click事件永远不会触发。很明显,我可以在页面加载时重新绑定中继器,但这是否意味着我必须在每次回发时都这样做?
更重要的是,当引发Card控件的单击事件时,我需要一种方法来触发父页面中另一个更新面板的更新。有没有一种方法可以在更新面板上设置触发器,以监听动态加载的UserControl中的事件?
非常感谢
Stewart
ASP.net网站上的示例代码应该可以解决您的第2点问题。
我把你代码的翻译交给你。
我可能误解了你想要做的事情,但我相信一旦你解决了这个问题,你的第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
}
这只是第2点的一个想法:在cardControl中添加一个属性来设置对updatepanel/s的引用怎么样?从那里,您可以添加触发器或调用按钮事件中的panel.update
对于第一点,是的,你必须这样做。你必须重新创建控件对于第2点,一个简单的updatePanel.update((将在任何事件中完成这项工作。如果您使用的事件绑定到动态创建的控件,则您必须在每个页面上重新绑定该事件回发