【问题标题】:How to create UpdatePanel triggers dynamically如何动态创建 UpdatePanel 触发器
【发布时间】:2012-03-12 21:11:30
【问题描述】:

我的 default.aspx 页面中有一个 UpdatePanel,UpdatePanel 有 asp 占位符,我还有一个 ascx 控件,它是网站的导航,它是根据数据库中的数据动态创建的,每个导航项都是一个 ImageButton,我在 DataList 中的每个循环都有每个对应 ascx 控件的 URL 的 HiddenField 值,例如 Value="~/controls/somecontrol.ascx"

这是我想要/需要做的: 我需要为我的 ascx 导航控件中 default.aspx 中的 UpdatePanel 动态创建触发器,所以我真正想要做的是我的每个导航项是一个“ImageButton”作为此 UpdatePanel 的触发器以及何时点击它,它将引用UpdatePanel中的占位符并根据NavigateUrl路径加载控件并执行placeholder.Controls.Add(mycontrol)。

Default.aspx 页面:

 <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:PlaceHolder ID="phMainHolder" runat="server"></asp:PlaceHolder>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

导航 ascx 控件:

<asp:DataList ID="dlnavigations" runat="server"  RepeatDirection="Horizontal" 
                onitemcommand="dlnavigations_ItemCommand" OnItemDataBound="dlnavigations_ItemDataBound">
                <ItemTemplate>                      
                    <asp:HiddenField ID="hfURL" Value='<%#Eval("strUrl")%>' runat="server" />     

                        <asp:ImageButton ID="imgTab" Width="20"   CommandArgument='<%#Eval("ID")%>'  
                            ImageUrl='<%#Eval("strIcon")%>' runat="server" />                        
                </ItemTemplate>
            </asp:DataList>


protected void dlnavigations_ItemCommand(object source, DataListCommandEventArgs e)
            {
                HiddenField hfURL = (HiddenField)e.Item.FindControl("hfURL");
                Control ctrl = LoadControl(hfURL.Value);
                myplaceholderinUpdatePanel.Controls.Clear();
                //here i need to reference my placeholder in UpdatePanel then
                myplaceholderinUpdatePanel.Controls.Add(ctrl);

            }

我不太确定这是否真的可以用 UpdatePanel 来做,请提供任何帮助,如果我不能用 UpdatePanel 来做,还有其他方法可以做同样的概念吗?

谢谢。

【问题讨论】:

  • 嗨蒂姆,对不起,我对你告诉我的概念不熟悉,我怎样才能通过链接按钮的点击以编程方式调用更新方法?你有任何示例代码或知道任何后剂量相同的东西吗?因为我花了很多时间搜索这个但找不到任何解决方案!
  • 抱歉,我刚刚删除了那条评论,因为我已经写了an answer
  • 我不确定它是否符合您的要求,因为您已经编辑了您的问题并添加了更多详细信息,但希望您现在更好地理解我的方法(请参阅我的编辑)。

标签: asp.net ajax visual-studio asp.net-ajax updatepanel


【解决方案1】:

如果我正确理解了您的要求,我会建议另一种方法:

UpdatePanel1's UpdateMode property 设置为Conditional

<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:PlaceHolder ID="phMainHolder" runat="server"></asp:PlaceHolder>
    </ContentTemplate>
</asp:UpdatePanel>

为了澄清一下事件驱动的方法,假设这是您的 UserControl 的代码隐藏:

public partial class Navigation : System.Web.UI.UserControl
{
   public delegate void NavigationHandler(int ID);
    public event NavigationHandler Navigated;

    void LinkButton_Command(Object sender, CommandEventArgs e)
    {
        int ID=int.Parse(e.CommandArgument.ToString());
        Navigated(ID);
    }
}

您的页面可以通过以下方式处理此事件:

protected void Page_Init(object sender, EventArgs e) {
    this.Navigation1.Navigated += UserNavigated;
}

protected void UserNavigated(int ID){
    //do whatever you need to do and then call...
    UpdatePanel1.Update();
}

【讨论】:

  • 我会试试这个,但你不认为要在每个 LinkBut​​ton_Command 上再次回发页面吗?因为我想使用 UpdatePanel 不回发整个页面的全部原因。
  • 顺便说一句,它不一定是 LinkBut​​ton_Command,其他任何不做回发的工作都可以。
  • @NazoTajrian:这将是一个异步回发,只有UpdatePanel1 的内容会被Update 方法更新。如果不是这种情况(通过调试ScriptManager.GetCurrent(Page).IsInAsyncPostback 进行检查),您需要将您的 UserControl 包装在另一个 UpdatePanel 中。
  • 蒂姆,非常感谢它运行良好,有一个小问题,只是为了测试,我在这个 ascx 控件中添加了一个 ID 为“xyz”的按钮和标签,我通过单击加载它导航链接按钮,当我单击“xyz”按钮时,它应该更改标签文本,但占位符中的所有内容都消失了,清楚吗?
  • @NazoTajrian:很难判断出了什么问题,但我确信这与这个问题或 UpdatePanels 无关。相反,我假设您最迟不会(重新)在 page_load 中的每个回发上加载动态控件。如果你不明白,再问一个问题。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2010-10-08
相关资源
最近更新 更多