2014-04-03 50 views
1

我有一個帶有可拖動和可拖放行的GridView。我使用tableDnD來實現這一點。拖放部分工作正常。我面臨的問題是,當我嘗試獲取重新排序的網格數據時,我需要將其保存回數據庫。我的代碼如下所示:使用TableDnD拖放GridView行

<script type="text/javascript"> 
    var strorder; 

    function reorder(table, row) { 
     if (!table) 
      table = $("#<%= gdvSteps.ClientID %>")[0]; 

     var rows = table.tBodies[0].rows; 
     var step = 1; 
     for (var i = 0; i < rows.length; i++) { 
      strorder = strorder + $(".orderbox", rows[i]).html + "|"; 
      $(".orderbox", rows[i]).html(step++); 
      strorder = strorder + $(".orderbox", rows[i]).html + ";"; 
     } 
    } 

    $(document).on('click', '#<%=btnSave.ClientID %>', function() { 
     $.ajax({ 
      type: "POST", 
      url: "Test_Grid.aspx/GridViewReorders", 
      data: '{"Reorder":"' + strorder + '"}', 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      async: true, 
      cache: false, 
      success: function (msg) { 
       alert("successful!" + msg.d); 
      } 
     }) 
     return false; 
    }); 

    $(document).ready(function() { 
     $("#<%= gdvSteps.ClientID %>").tableDnD({ 
      dragHandle: ".dragHandle", 
      onDrop: reorder 
     });    

     $("#<%= gdvSteps.ClientID %> tr").hover(function() { 
      $(this.cells[0]).addClass('showDragHandle'); 
     }, function() { 
      $(this.cells[0]).removeClass('showDragHandle'); 
     }); 
    }); 

</script> 

<div> 
<asp:GridView ID="gdvSteps" runat="server" OnRowEditing="gdvSteps_RowEditing" 
OnRowUpdating="gdvSteps_RowUpdating" OnRowCancelingEdit="gdvSteps_RowCancelingEdit" 
    AutoGenerateColumns="false"> 
    <Columns> 
     <asp:ImageField ItemStyle-CssClass="dragHandle"> 
     </asp:ImageField> 
     <asp:BoundField DataField="Step" HeaderText="P" ItemStyle-CssClass="orderbox" ItemStyle-Width="10px" /> 
     <asp:TemplateField HeaderText="Sistem"> 
      <ItemTemplate> 
       <asp:Label ID="lblSistem" runat="server" Text='<%# Bind("Sistem") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlSistem" runat="server" DataTextField="SUP_MCH_CODE" DataValueField="SUP_MCH_CODE" 
        OnSelectedIndexChanged="ddlSistem_SelectedIndexChanged" AutoPostBack="true"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <ItemStyle Width="40px" /> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Box"> 
      <ItemTemplate> 
       <asp:Label ID="lblBox" runat="server" Text='<%# Bind("Box") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlBox" runat="server" DataTextField="MCH_CODE" DataValueField="OBJID"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <ItemStyle Width="40px" /> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Job"> 
      <ItemTemplate> 
       <asp:Label ID="lblJob" runat="server" Text='<%# Bind("Job") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlJob" runat="server" DataTextField="Job" DataValueField="IDJob"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <ItemStyle Width="300px" /> 
      <FooterStyle HorizontalAlign="Left" /> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Observations"> 
      <ItemTemplate> 
       <asp:Label ID="lblObservations" runat="server" Text='<%# Bind("Observations") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtObservations" runat="server" DataTextField="Observations" DataValueField="Observations"> 
       </asp:TextBox> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Executant"> 
      <ItemTemplate> 
       <asp:Label ID="lblExecutant" runat="server" Text='<%# Bind("Executant") %>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlExecutant" runat="server" DataTextField="Executant" DataValueField="IDExecutant"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <ItemStyle Width="250px" /> 
      <FooterStyle HorizontalAlign="Left" /> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:ImageButton ID="btnEdit" runat="server" CausesValidation="False" CommandName="Edit" 
        ImageUrl="~/Imagenes/Edit.png" Text="Edit" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <table> 
        <tr> 
         <td> 
          <asp:ImageButton ID="btnUpdate" runat="server" CausesValidation="True" ImageUrl="~/Imagenes/Ok.png" 
           CommandName="Update" Text="Update"></asp:ImageButton> 
         </td> 
         <td> 
          <asp:ImageButton ID="btnCancel" runat="server" CausesValidation="False" ImageUrl="~/Imagenes/Cancel.png" 
           CommandName="Cancel" Text="Cancel"></asp:ImageButton> 
         </td> 
        </tr> 
       </table> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:ImageButton ID="btnDelete" runat="server" CausesValidation="False" CommandName="Delete" 
        ImageUrl="~/Imagenes/Delete.png" Text="Delete" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
<asp:Button ID="btnSave" runat="server" Text="Save" /> 
</div> 

而且代碼隱藏功能我打電話是這樣的:

[WebMethod]   
public static string GridViewReorders(string Reorder) 
{   
    return Reorder.Split(';')[0]; 
} 

暫時我只是測試,如果我能得到數據,當我打的保存按鈕。

事情是,當我重新排序行之前按鈕,它工作正常。正在調用該方法並顯示警報消息。但是,如果我在重新排序行之後按下按鈕,則不執行任何操作,並且該方法未被調用。

我不知道這是否是獲取重新排序的行數據的最佳方式。我不知道爲什麼按鈕或方法在重新排序後停止工作。

任何幫助將不勝感激!

以下是幫我建立這個鏈接:

http://isocra.com/2008/02/table-drag-and-drop-jquery-plugin/

http://aspdotnet-example.blogspot.com.ar/2011/10/gridview-reorder-row-drag-and-drop.html

+0

你有沒有想過這個? – PeonProgrammer

回答

0

我有點晚了你的帖子。我相信你現在已經想出了一個替代解決方案。但是,我想我會補充一點,我也遇到了同樣的問題,並認爲我會爲此與自己的戰鬥做出貢獻。

最初,我有我的gridview裏面的updatepanel。當我使用tablednd移動一行時,結果將會重新正確地重新排序。我正在使用類似於你所擁有的Ajax和webmethods。我會使用webmethod進行拆分,以便爲每行獲取Id和新的SortOrder並進行批量更新。

然而,網格不再允許你移動任何東西后,它呈現新的順序,我會觸發點擊事件隱藏的asp按鈕重新填充網格。

正在使用隱藏按鈕,因爲Webmethod只能處理重新排序並且必須調用隱藏按鈕來重新綁定gridview。所以,我在下面結束了。

$(document).ready(function() 
    { 
     $('#gvLocations').tableDnD({ 
      onDrop: function (table, row) 
      { 
       var serialize = $.tableDnD.serialize();//$('#gvLocations').tableDnDSerialize(); 

       $.ajax({ 
        type: "POST", 
        url: "RowsUpDownOrDragging.aspx/RowOrderSerialize", 
        data: "{sortedIDs: '" + serialize + "'}", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: OnSuccess 
       }); 
      } 
     }); 

     function OnSuccess() 
     { 
      location.reload(); 
      //$("#ReloadThePanel").trigger("click"); //hidden button 
     } 
    }); 

當我註釋掉/刪除UpdatePanel的包裝,我能夠重新安排電網和不輸tablednd功能。所以,似乎與tablednd之間的脫節讓人對部分重新綁定感到困惑。

無論如何,如果你仔細觀察OnSuccess方法,我現在使用的location.reload()作爲隱藏按鈕變得矯枉過正。我不滿意我必須進行整頁刷新。但是,通過這種方式,一切都可以正確使用我的代碼。

編輯:昨天發佈了這個消息後,我碰到了this website - 它解決了發生在updatepanel中的部分回發,影響了繼續拖動行的能力。關鍵行是這個

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(gvLocations_LazyLoad); 

一旦我開始用這個,我可以做局部更新,而不是重新加載整個頁面。