使用AJAX调用删除行后,GridView DropDownList控件丢失所选值

时间:2015-11-12 23:23:54

标签: c# asp.net ajax

我正在使用AJAX从GridView中删除一行,并且它可以正常工作。

$('.btnDelete').click(function () {
            var rowsCount = <%=gvLineItems.Rows.Count %>;
            var row = $(this).closest("tr");
            if (rowsCount > 1) {
                $.ajax({
                    type: "POST",
                    url: "f_PromotionForm.aspx/DeleteItem",
                    data: JSON.stringify({ itemId: $(this).attr('id') }),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(response) {
                        if (response.d) {
                            row.remove();
                        }
                    }
                });
            }
        });

f_PromotionForm.aspx / DeleteItem是一个从数据库中删除项目的WebMethod。

这是GridView:

<asp:GridView ID="gvLineItems" runat="server" AutoGenerateColumns="false" DataKeyNames="ID" OnRowDataBound="gvLineItems_RowDataBound" >
 <Columns>
 <asp:TemplateField HeaderText="Item Description">
                <ItemTemplate>
                    <asp:DropDownList ID="dlItemDescription" runat="server" DataValueField="ItemCode" DataTextField="ItemDesc" AppendDataBoundItems="true">
                        <asp:ListItem Text="-- SELECT ITEM --" Value="-1" />
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
 <asp:TemplateField>
                <ItemTemplate>
                    <input class="btnDelete" type="button" value="Delete" id='<%# Eval("ID") %>' />
                </ItemTemplate>
            </asp:TemplateField>
 </Columns>
</asp:GridView>

问题:

在删除行后的后续回发(例如,单击“提交”按钮)中,已删除行的位置之后的第一行将从下拉列表中丢失其选定值(默认值为-1)。

当我在浏览器中检查POST时,正在发送该行的下拉列表选定值。其他行中的其他下拉列表不会丢失其选定的值。它只是删除后的第一行中的下拉列表。此外,该行中存在问题的其他字段仍然保留其值(我没有在上面的Gridview代码中显示这些字段以保持简单)。

在具有事件处理程序的按钮触发的回发上,出现以下事件序列导致问题:

Page_Init:从数据库和数据绑定中加载Gridview项目

 //call to db and fill datatable dt with query results (dt has correct rows & values), then:
 gvLineItems.DataSource = dt;
 gvLineItems.DataBind();

Page_Load:影响Gridview的任何事情都发生在这里

事件处理程序:

protected void btnSave_OnClick(object sender, EventArgs e)
{
    SaveForm();
}

private bool SaveForm() {
    foreach(GridViewRow row in gvLineItems.Rows)  //this has the correct number of rows
    {
        DropDownList dlItemDescription = (DropDownList) row.FindControl("dlItemDescription");

        //test2 correctly shows the selected item value
        //except for the first row after the previously deleted row.

        var test2 = dlItemDescription.SelectedItem.Value; //**PROBLEM

        //save stuff...
    }
}

请注意: 一个约束是GridView不能使用ViewState,所以我禁用它。

问题:

如何阻止下拉列表丢失其选定值?

1 个答案:

答案 0 :(得分:0)

之前我曾使用this approach来帮助处理页面上的ajax后期内容。很有用。您仍然需要弄清楚如何保存问题的下拉值并重新应用该值。你可以将POST前的值保存到页面上的隐藏字段,重新应用它,结束POST。第h