【问题标题】:How to work with two update panels on same .aspx page如何在同一个 .aspx 页面上使用两个更新面板
【发布时间】:2012-07-06 07:57:11
【问题描述】:

我在一个页面上有两个更新面板。我想在不同的 2 条件下更新这两个条件。但我不知道为什么这没有发生。我已经为两者指定了触发器,但没有帮助,下面是我的代码。

请让我知道我错在哪里。

实际上,当它们的 selectedindexchange 被触发时,第一个更新面板中有三个下拉列表,然后第二个更新面板的内容也会更新。

<asp:UpdatePanel ID="upSearch" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
    <ContentTemplate>
        <div style="float: left; width: auto;">

            <asp:DropDownList ID="ddlLocation" runat="server" Width="206px" DataTextField="LocationName"
                DataValueField="Locationid" AutoPostBack="true" OnSelectedIndexChanged="ddlLocation_SelectedIndexChanged">
            </asp:DropDownList>

            &nbsp;
            <asp:DropDownList ID="ddlArea" runat="server" Width="200px" DataTextField="AreaName"
                DataValueField="Areaid" AutoPostBack="true" OnSelectedIndexChanged="ddlArea_SelectedIndexChanged">
            </asp:DropDownList>

            &nbsp;
            <asp:DropDownList ID="ddlRoom" runat="server" Width="200px" DataTextField="RoomName"
                DataValueField="Roomid">
            </asp:DropDownList>
            &nbsp;

        </div>
        <div style="float: left; width: 80px;">
            <asp:Button ID="btnSearch" runat="server" Text="Search" ValidationGroup="vgSearch"
                CssClass="bluebtn" UseSubmitBehavior="false" OnClick="btnSearch_Click" />
        </div>
        <div style="float: left; width: 99%; padding: 5px 0px;">
        </div>
    </ContentTemplate>
  </asp:UpdatePanel>

第二个如下:-

<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
<ContentTemplate>
    <asp:Calendar ID="calSchedule" runat="server" NextPrevFormat="FullMonth" OnDayRender="calSchedule_DayRender"
        OnVisibleMonthChanged="calSchedule_VisibleMonthChanged">
        <DayHeaderStyle CssClass="dayheaderStyle" />
        <NextPrevStyle />
        <OtherMonthDayStyle BackColor="#ffffff" />
        <SelectedDayStyle />
        <TitleStyle CssClass="titleStyle" />
        <TodayDayStyle BackColor="#ffffa0" ForeColor="#6699cc" />
        <WeekendDayStyle />
        <DayStyle CssClass="dayStyle" />
    </asp:Calendar>
</ContentTemplate>
<Triggers>
    <asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
</Triggers>
</asp:UpdatePanel>

【问题讨论】:

  • 您是否遇到任何错误?,如果然后粘贴该错误消息?
  • 不,我没有收到任何错误。
  • 您是否尝试过 btnSearch_Click 代码,您可以更新第二个面板控件!
  • 只是为了让每个人都清楚地看到这一点 - “当他们的 selectedindexchange 被触发时,第一个更新面板中的三个下拉列表,然后第二个更新面板的内容也更新”是这个问题吗?更新面板 2 不应该刷新?
  • 是的,这正是问题所在。

标签: c# asp.net triggers updatepanel


【解决方案1】:

首先我想回忆一下UpdateMode的用法

  • Always 面板将在页面上的每个帖子上更新其内容,它们可以是部分渲染帖子或完整帖子,在这两种情况下面板的内容都会更新

  • Conditional面板的内容只有满足不同的条件才会更新:

    • 默认情况下,其子对象触发的事件会触发更新,可以更改此行为设置ChildrenAsTriggers="false"

    • 当您在UpdatePanel 的Triggers 部分声明触发器时

    • 当你显式调用UpdatePanel.Update()方法时

    • 整页帖子将触发更新

以下代码执行以下操作:

  • 每个 UpdatePanel 都会在其子控件引发事件时更新

  • UpdatePanel 1 命名为:up1仅在其子控件引发事件时更新

  • 名为 up2 的 UpdatePanel 2 将在其子控件引发事件时更新

  • 当触发定义的触发器时,名为 up2 的 UpdatePanel 2 也将被更新,在这种情况下,当 UpdatePanel 1 上名为 ddl1OnPanel1 的 DropDownList 触发其 SelectedIndexChanged

  • 当 UpdatePanel 1 上名为 ddl2OnPanel1 的 DropDownList 引发其 SelectedIndexChanged 时,名为 up2 的 UpdatePanel 2 也将更新,因为在代码中它显式调用:this.up2.Update();

我认为调整这段代码,你可以达到你想要的目标,只需将它复制粘贴到一个新页面上并运行它

检查以下代码(查看显示日期的标签如何根据引发的事件以不同方式受到影响):

代码隐藏

    protected void ddl1OnPanel1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.lblMessageOnPanel1.Text = "From ddl1 " + DateTime.Now.ToString();
        this.calendarOnPanel2.SelectedDate = DateTime.Today.AddDays(1);
        this.lblMessageOnPanel2.Text = "From ddl1 " + DateTime.Now.ToString();
    }

    protected void ddl2OnPanel1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.lblMessageOnPanel1.Text = "From ddl2 " + DateTime.Now.ToString();
        this.calendarOnPanel2.SelectedDate = DateTime.Today.AddDays(2);
        this.lblMessageOnPanel2.Text = "From ddl2 " + DateTime.Now.ToString();
        this.up2.Update();
    }

ASPX

    <asp:ScriptManager runat="server" ID="scriptManager" />
    <asp:Button Text="Full Post" runat="server" />
    <br />
    <asp:UpdatePanel runat="server" ID="up1" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:DropDownList runat="server" ID="ddl1OnPanel1" AutoPostBack="true" OnSelectedIndexChanged="ddl1OnPanel1_SelectedIndexChanged">
                <asp:ListItem Text="text1" />
                <asp:ListItem Text="text2" />
            </asp:DropDownList>
            <br />
            <asp:DropDownList runat="server" ID="ddl2OnPanel1" AutoPostBack="true" OnSelectedIndexChanged="ddl2OnPanel1_SelectedIndexChanged">
                <asp:ListItem Text="text3" />
                <asp:ListItem Text="text4" />
            </asp:DropDownList>
            <br />
            <asp:Label runat="server" ID="lblMessageOnPanel1" />
            <br />
            <asp:Button ID="Button1" Text="text" runat="server" />
            <br />
            On every post on Panel 1: <%:DateTime.Now %>
        </ContentTemplate>
    </asp:UpdatePanel>

    <br />
    <br />
    <asp:UpdatePanel runat="server" ID="up2" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Calendar ID="calendarOnPanel2" runat="server" >
                <DayHeaderStyle CssClass="dayheaderStyle" />
                <NextPrevStyle />
                <OtherMonthDayStyle BackColor="#ffffff" />
                <SelectedDayStyle />
                <TitleStyle CssClass="titleStyle" />
                <TodayDayStyle BackColor="#ffffa0" ForeColor="#6699cc" />
                <WeekendDayStyle />
                <DayStyle CssClass="dayStyle" />
            </asp:Calendar>
            <br />
            <asp:Label ID="lblMessageOnPanel2" runat="server" />
            <br />
            On every post On Panel 2: <%:DateTime.Now %>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddl1OnPanel1" EventName="SelectedIndexChanged" />
        </Triggers>
    </asp:UpdatePanel>

简单输出

您可以更改 UpdatePanel 2 上的 UpdateMode="Always" 以查看差异,如果您这样做,此面板将在每个帖子上更新,无论是完整帖子还是来自 UpdatePanel1 的帖子

【讨论】:

    【解决方案2】:

    我成功地将它用于 4 更新面板。

    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
    
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnableScriptGlobalization="true" CombineScripts="false" ScriptMode="Release">
    </asp:ToolkitScriptManager>
    

    【讨论】:

      【解决方案3】:

      如果您希望异步回发发生,请从下拉列表中删除 Autopostback="True"。 另外,目前究竟出了什么问题?更新面板根本不更新?

      编辑。同时删除 childrenAsTriggers,因为此时不需要它

      【讨论】:

      • 如果我删除 AutoPostBack=True 那么我的 selectedindexchange 事件将不起作用。
      • 那到底是什么问题呢?页面是发回还是什么也没发生?
      • 页面在 selectedindex 触发时返回,第二个更新面板的内容也刷新了。而且我也尝试过将 ChildrenasTrigger 设置为 false 但它不起作用
      【解决方案4】:

      如果您使用的是嵌套更新面板,请参考以下示例代码:

      <asp:UpdatePanel id="UpdatePanel1" UpdateMode="Conditional" runat="server">
                  <ContentTemplate>
                      <fieldset>
                      <legend>Parent UpdatePanel</legend>
                      Last refresh <%=DateTime.Now.ToString() %> <br />
                      <asp:Button ID="Button1" runat="server" Text="Refresh Outer Panel" />
                      <asp:UpdatePanel ID="UpdatePanel2" runat="server">
                          <ContentTemplate>
                              <fieldset>
                              <legend>Nested UpdatePanel</legend>
                               Last refresh <%=DateTime.Now.ToString() %> <br />
                              <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
                              </fieldset>
                          </ContentTemplate>
                      </asp:UpdatePanel>
                      </fieldset>
                  </ContentTemplate>
              </asp:UpdatePanel>
      

      如果不使用嵌套更新面板,则从代码的两个更新面板中删除“UpdateMode”条件。

      【讨论】:

      • 这行代码&lt;%= WhatEverCall %&gt; 通常不适用于更新面板。
      • 我没有使用嵌套更新面板。请仔细研究我的代码和问题。
      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2016-10-22
      • 2011-07-27
      • 2011-12-08
      相关资源
      最近更新 更多