2011-07-26 12 views
5

Tôi có đoạn mã sau đó áp dụng các plugin jQuery UI Sortable để tất cả các bảng (GridView) trên một trang ASP.NET, trừ (tiêu đề) hàng đầu tiên trong mỗi:Làm thế nào để có điều kiện áp dụng tiện ích UI jQuery Sortable vào bảng (ASP.NET GridView)?

function pageLoad() { 
    $('table').sortable({ 
     items: 'tr:not(:first)', 
     axis: 'y', 
     scroll: true, 
     start: startDrag, //store start position 
     stop: stopDrag //get end position, update database 
    }).disableSelection(); 

Tuy nhiên tôi chỉ muốn áp dụng có thể sắp xếp thành một bảng nếu có nhiều hơn một hàng (ngoài hàng tiêu đề), nếu không thì chức năng kéo/thả là không cần thiết.

Làm cách nào tôi có thể áp dụng điều kiện ở trên chỉ cho các bảng có nhiều hàng nội dung? Cảm ơn.

+0

Điều này thật tuyệt vời và rất kịp thời khi tôi cần một thứ gì đó giống như nó. 2 Câu hỏi cần thêm: 1) startDrag không xác định. Tôi giả sử tôi cần phải khai báo nó trong codebehind nhưng loại dữ liệu nào? 2) Tôi đang sử dụng điều này để cho phép người dùng sử dụng danh sách có thứ tự dựa trên cột 'đơn đặt hàng' (int). Có cách nào hiệu quả để lưu lại cơ sở dữ liệu này không? – nycdan

+0

Có lẽ một câu hỏi hay hơn là làm thế nào tôi có thể đọc các vị trí mới trong GridView. Khi tôi trao đổi các mục 0 và 1 và đọc gridview1.Rows [0] .Cells [1] .Text nó vẫn hiển thị mục gốc. Không chắc chắn cách đọc các mục sắp xếp sau trong mỗi vị trí. – nycdan

+0

bạn có thể kiểm tra jquery 'index()' thường xuyên của phần tử bị rớt hoặc xuất trạng thái đầy đủ bằng cách sử dụng 'sortable.serialize()': http://jqueryui.com/demos/sortable/#method-serialize –

Trả lời

5

jquery filter() cung cấp giải pháp. Nó cho phép bạn lọc một tập hợp các phần tử phù hợp bằng cách sử dụng hàm kiểm tra. Do đó các mã sau đây áp dụng sortable chỉ để bàn có nhiều hơn một dòng dữ liệu:

function pageLoad() { 

    $('table').filter(function() { 
         return $('tr', this).length > 2; 
         }) 
       .sortable({ 
       items: 'tr:not(:first)', 
       axis: 'y', 
       scroll: true, 
       start: startDrag, //store start position 
       stop: stopDrag //get end position, update database 
       }) 
       .disableSelection(); 
} 
+0

Hoạt động hoàn hảo, cảm ơn! :) –

0

Để đối phó với nydcan của các truy vấn trên, phương pháp startDrag trông như thế này:

function startDrag(event, ui) { 
    var startIndex = ui.item.index(); 
    ui.item.data('startIndex', startIndex); 
} 

Và phương pháp stopDrag vẻ như thế này:

function stopDrag(event, ui) { 
    var startIndex = ui.item.data('startIndex'); 
    var endIndex = ui.item.index(); 
    if (startIndex != endIndex) { 
     $.ajax({ 
      type: 'POST', 
      url: '<%= ResolveUrl("~/MyPage.aspx/UpdateOrder") %>', 
      contentType: 'application/json; charset=utf-8', 
      data: "{ 'startIndex':'" + startIndex + "', 'endIndex':'" + endIndex + "'}", 
      dataType: 'json', 
      success: updateSuccess, 
      error: updateError 
     }); 
    } 
} 

sau đó tôi có một phương pháp web (VB.NET) trên trang web của tôi như thế này:

<System.Web.Services.WebMethod()> 
Public Shared Sub UpdateRulePriority(ByVal startIndex As Integer, ByVal endIndex As Integer) 

    'Do stuff 

End Sub 

Hy vọng điều đó sẽ hữu ích.