Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从动态加载的UserControl中的事件触发UpdatePanel?_C#_Asp.net_Asp.net Ajax_Updatepanel - Fatal编程技术网

C# 如何从动态加载的UserControl中的事件触发UpdatePanel?

C# 如何从动态加载的UserControl中的事件触发UpdatePanel?,c#,asp.net,asp.net-ajax,updatepanel,C#,Asp.net,Asp.net Ajax,Updatepanel,我正在使用Ajax、c#和.NET3.5编写一个纸牌游戏应用程序。由于界面的性质,我有许多更新面板,我试图管理和更新不同的用户操作。不过我有一个问题 玩家当前手牌是通过将卡对象列表绑定到中继器,然后动态创建一个卡用户控件,并在每个项目数据绑定时将其添加到占位符的控件中来构建的。代码大致如下: 在页面上 <asp:UpdatePanel ID="pnlInHand" runat="server" UpdateMode="Conditional"> <ContentTemp

我正在使用Ajax、c#和.NET3.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>
卡控件包括一个按钮。此按钮的ClickEvent调用父页面的方法,该方法需要更新单独的UpdatePanel,并从其所在的面板中删除卡控件

我有两个问题

  • 当我单击卡片控件按钮时,因为它是作为updatePanel中的中继器的一部分创建的,所以当页面发回时,它不再存在,因此控件中按钮的单击事件永远不会触发。显然,我可以在页面加载时重新绑定转发器,但这是否意味着我必须在每次回发时都这样做

  • 更重要的是,我需要一种方法,在引发卡控件的click事件时触发父页面中另一个updatepanel的更新。有没有一种方法可以在更新面板上设置一个触发器,用于侦听Dynamicly加载的UserControl中的事件

  • 非常感谢


    Stewart只是第2点的一个想法:在cardControl中添加一个属性来设置对updatepanel的引用怎么样?从那里,您可以在按钮事件中添加触发器或调用panel.update,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
    }
    
    
    
    受保护的void itemDataBound(对象发送方、RepeaterItemEventArgs e) { modalpopu_WebUserControl mw=(modalpopu_WebUserControl)e.Item.FindControl(“user1”); AsyncPostBackTrigger at=新的AsyncPostBackTrigger(); at.ControlID=mw.ID; at.EventName=“CausePostBack”; UpdatePanel2.Triggers.Add(at); } 受保护的void user1\u CausePostBack(对象发送方,事件参数e) { //做点什么 }
    对于第一点,是的,你必须这样做。你必须重新创建控件
    对于第2点,一个简单的updatePanel.update()如果使用绑定到动态创建控件的事件,则必须在每个页面回发时重新绑定事件

    更新面板需要从父页面进行更新,因为用户控件中的单击事件仅调用父页面中的方法并基于UpdatePanel中的方法是否已更新。
    <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
    }