【问题标题】:AsyncPostBackTrigger works only the first timeAsyncPostBackTrigger 仅在第一次工作
【发布时间】:2016-02-17 15:35:22
【问题描述】:

我有一个包含网格视图的更新面板。 此网格有一个下拉列表列。

测试版 aspx 代码:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" EnablePartialRendering="false" UpdateMode="Conditional"> 

...
  <asp:GridView ID="Gv_Queue" runat="server">

    <Columns>

      <asp:TemplateField HeaderText="H">
        <ItemTemplate>
          <asp:DropDownList ID="ddl_proprietà" runat="server" OnSelectedIndexChanged="ddl_proprietà_SelectedIndexChanged" AutoPostBack="true"/>
        </ItemTemplate>

    </Columns>

  </asp:GridView

</asp:UpdatePanel>

我通过代码在UpdatePanel中添加了DDL的触发器:

AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = dl.UniqueID;  //dl is the Drop Down control
UpdatePanel1.Triggers.Add(trigger);

它在第一个 selectedIndexChanged 事件中运行良好......但第二次触发该事件时,触发器无法正常工作,因为回发操作运行。

我已经试过了:

  • 将 AsyncPostBackTrigger 更改为 PostBackTrigger 但缺少 抛出组件异常。
  • 将UpdatePanel 属性中的updateMode 更改为“Always”。
  • 在 ItemTemplate 列中放置另一个 UpdatePanel,仅用于
    下拉菜单。

【问题讨论】:

  • 为什么要以编程方式添加触发器?您必须在每次回发时重新创建它。
  • 因为如果我在 aspx 代码中添加触发器它不起作用: 它没有找到控件...但我想你是对的,第一次点击触发器存在,第二次死亡。

标签: c# asp.net gridview updatepanel postback


【解决方案1】:

在我的情况下,问题是因为我在页面上有 2 个具有相同 ID 的控件。如果之前的回复没有解决问题,您可能需要检查一下。

【讨论】:

    【解决方案2】:

    我找到了解决我自己问题的方法。 你没问题:我天真地忘记了触发器在第一个事件之后不起作用,只是因为它必须重新创建。

    奇怪的是,即使在 on_Load 中重新创建触发器也没有解决问题。

    我用另一个更新面板做到了这一点:

    <asp:TemplateField HeaderText="H">
      <ItemTemplate>
        <asp:UpdatePanel runat="server" UpdateMode="Conditional">
          <ContentTemplate>
            <asp:DropDownList ID="ddl_proprietà" runat="server" OnSelectedIndexChanged="ddl_proprietà_SelectedIndexChanged"
                                                            AutoPostBack="true"/>
          </ContentTemplate>
    
          <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddl_proprietà" />
           </Triggers>
    
        </asp:UpdatePanel>          
    
      </ItemTemplate>
    </asp:TemplateField>  
    

    【讨论】:

      【解决方案3】:

      您必须在每次回发时重新创建触发器。您可以将此代码添加到DropDownListLoad 事件中:

      aspx:

      <asp:TemplateField HeaderText="H">
          <ItemTemplate>
            <asp:DropDownList ID="ddl_proprietà" OnLoad="ddl_proprietà_OnLoad" runat="server" OnSelectedIndexChanged="ddl_proprietà_SelectedIndexChanged" AutoPostBack="true"/>
          </ItemTemplate>
      </asp:TemplateField>
      

      代码隐藏:

      protected void ddl_proprietà_OnLoad(object sender, EventArgs e)
      {
          AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
          trigger.ControlID = ((Control)sender).UniqueID; // sender is the DropDown control
          UpdatePanel1.Triggers.Add(trigger);
      }
      

      【讨论】:

      • 感谢您的回答。奇怪的是,您的解决方案不起作用,但您对重新创建触发器是正确的。无论如何我找到了解决方案,我发布了它! :-)
      猜你喜欢
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多