我正在使用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將成爲狀態泡芙沼澤人,並導致性能問題。使用隱藏字段的 –