2015-11-12 55 views
0

我正在使用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的,所以我把它關閉。

問:

如何防止失去其選定的值的下拉列表?

+0

只能在下拉菜單上使用viewstate嗎? – wazz

+0

@wazz - no。當許多行被添加到表中時,viewstate將成爲狀態泡芙沼澤人,並導致性能問題。使用隱藏字段的 –

回答

0

我之前使用過this approach來幫助頁面上的後Ajax的東西。很有用。您仍然必須弄清楚如何保存問題下拉列表的值並重新應用該值。您可以將該值pre-POST保存到頁面上的隱藏字段,重新應用它,結束POST。心連心。

+0

可能會訣竅。我即將離開的一天,所以明天我會拍這張照片。 –

+0

這沒有奏效。我添加了一個隱藏字段,並驗證它在回發之前已更新。 html渲染正確顯示了隱藏的字段和表結構,並且POST是正確的,但是在刪除後的行的隱藏字段沒有值,即使在Request.Form中也是如此。 –

相關問題