【问题标题】:How to prevent full page postback on selectedindexchange for dropdownlist如何防止对下拉列表的 selectedindexchange 进行整页回发
【发布时间】:2015-05-20 14:38:07
【问题描述】:
<asp:UpdatePanel runat="server" ClientIDMode="Static" ID="TasksUpdatePanel" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Panel ID="pnlDropDown" runat="server" ClientIDMode="Static" CssClass="pnlDropDown">
            <!-- TASK NAME -->
            <asp:DropDownList ID="ddlTaskName" CssClass="chosen-select" DataSourceID="dsPopulateTaskName" AutoPostBack="true" DataValueField="Task Name" runat="server" Width="100%" Font-Size="11px" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlTaskName_onSelectIndexChanged">
                <asp:ListItem Text="All" Value="%"></asp:ListItem>
            </asp:DropDownList>

        </asp:Panel>
        <asp:GridView ShowHeaderWhenEmpty="false" AlternatingRowStyle-BackColor="#EBE9E9" AutoGenerateColumns="false" OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="You currently have no tasks assigned to you" OnRowDataBound="yourTasksGV_RowDataBound" OnRowCreated="yourTasksGV_RowCreated">
            <Columns>
                <asp:TemplateField HeaderStyle-Width="2%">
                    <ItemTemplate>
                        <asp:ImageButton ImageUrl="~/cies.png" runat="server" ID="btnShowDepend" OnCommand="btnShowDepend_Command" CommandName="TaskDepend" CommandArgument='<%#Eval("TestIt") %>' ToolTip="Click to view Dependencies" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:HyperLinkField HeaderStyle-Width="16%" Target="_self" DataNavigateUrlFields="Task Detail" DataTextField="Task Name" DataNavigateUrlFormatString="" HeaderText="Task Detail" SortExpression="Task Name" ItemStyle-CssClass="taskTableColumn" />
                <asp:BoundField HeaderStyle-Width="10%" DataField="Workgroup" HeaderText="Workgroup" SortExpression="Workgroup" ItemStyle-CssClass="taskTableColumn" />
                <asp:BoundField HeaderStyle-Width="7%" DataField="Status" HeaderText="Status" SortExpression="Status" ItemStyle-CssClass="taskTableColumn" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
    <%--<Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlTaskName" EventName="onSelectIndexChanged" />
    </Triggers>--%>
</asp:UpdatePanel>

每当执行ddlTaskName_onSelectIndexChanged 函数时,都会进行整页回发,而不仅仅是更新UpdatePanel

ddlTaskName_onSelectIndexChanged函数:

protected void ddlTaskName_onSelectIndexChanged(object sender, EventArgs e)
{
    PullData(ViewState["sortExp"].ToString(), ViewState["sortOrder"].ToString(), false); //calls a function to update the GridView
}

使用上面的代码,每当ddlTaskName 中的索引发生更改时,页面都会执行完整回发,而不仅仅是部分回发(仅更新 GridView)

我可以添加/修改哪些代码以确保不执行完整的回发,并且仅在索引更改时更新 GridView。

想...我需要将它们添加到两个单独的 UpdatePanel 中吗?

如果我取消注释 triggers,我会收到以下错误:A control with ID 'ddlTaskName' could not be found for the trigger in UpdatePanel 'TasksUpdatePanel'.

我将下拉列表附加到 Gridview,如下所示:

是不是因为这个:

protected void yourTasksGV_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        GridView hGrid = (GridView)sender;
        GridViewRow gvrRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);

        TableHeaderCell tcCellTask = new TableHeaderCell();
        tcCellTask.Controls.Add(ddlTaskName);
        gvrRow.Cells.Add(tcCellTask);

        yourTasksGV.Controls[0].Controls.AddAt(0, gvrRow);
    }
}

【问题讨论】:

  • 您是否尝试过将 Gridview 包装在另一个 UpdatePanel 中并将当前触发器移入其中?见这里:asp.net/web-forms/overview/older-versions-getting-started/…
  • 你的意思是,有两个独立的更新面板?一个用于下拉菜单,一个用于 GridView?但是如果它们合二为一,那不应该是一样的吗?我只是对为什么它存在时找不到 ID 感到惊讶和困惑。
  • 是的,2 个更新面板。 1 轮下拉和 1 轮 Gridview。然后将触发器放在与下拉列表相关的 Gridview 更新面板中。
  • 您是否尝试过将 Gridview 嵌套在当前 1 中它自己的更新面板中,然后将 ddl 设置为 Gridview 更新面板中的触发器?
  • 尝试将外部更新面板上的 ChildrenAsTriggers 属性设置为 false,将内部更新面板上的 ChildrenAsTriggers 属性设置为 true。

标签: c# asp.net drop-down-menu updatepanel jquery-chosen


【解决方案1】:

您的代码看起来不错。您是否尝试注释掉 asp:Panel 选项卡? 如果取消注释触发器,则需要在 gridview 周围放置 asp:UpdatePanel

【讨论】:

  • 我很可能必须在两个单独的 UpdatePanel 中分离 DDL 和 GridView?我已经按照你说的做了,但它仍然一直说找不到ddlTaskName:/ 奇怪...我认为我的代码看起来也不错...是因为我使用的是chosen jquery 库吗?跨度>
  • 没关系,我删除了 cssclass 但还是一样:/
  • pnlDropDown?我正在使用它来设置我的下拉列表的样式。我应该只使用标准 DIV 吗?
  • 我仍然需要从代码隐藏中查看 div 才能隐藏和显示。我可以使用 runat="server"。我现在将测试它。谢谢。
  • 还是一样。我不明白为什么没有看到控件:/
【解决方案2】:

根据post,看起来您的 asp:Panel 可能是 ClientIDMode="Static" 的罪魁祸首。尝试更改它以使其继承。

【讨论】:

  • 不。我删除了它,它仍然是一样的。我认为这是因为我在 RowCreated 函数中的下拉列表中随机播放。
【解决方案3】:

您需要在UpdatePanel 标记中指定ChildrenAsTriggers="true"。您遇到的错误是因为您的下拉列表实际上并不存在于标记中,这是触发线在编译/运行时期望找到的 - 相反,您将其作为控件动态添加到 RowCreated 函数中。如果您想尝试,可以在同一个函数中动态地将触发器添加到 UpdatePanel。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多