2015-11-12 51 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中也是如此。 –

相关问题