我正在使用AJAX从GridView中删除一行,并且它工作正常。GridView DropDownList控件在使用AJAX调用删除行后丢失选定值
$('.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的,所以我把它关闭。
问:
如何防止失去其选定的值的下拉列表?
只能在下拉菜单上使用viewstate吗? – wazz
@wazz - no。当许多行被添加到表中时,viewstate将成为状态泡芙沼泽人,并导致性能问题。使用隐藏字段的 –