2012-02-14 5 views
6

Việc sử dụng lưới của tôi liên quan đến sắp xếp trong khi có một vài hàng ở chế độ chỉnh sửa nội dòng.Vấn đề với cột sắp xếp trong khi chỉnh sửa hàng nội tuyến trong jqGrid

Các câu hỏi sẽ là:

  1. Có cách nào để thực hiện phân loại, trong khi biên tập inline một hoặc nhiều hàng?

  2. Nếu không, là có một sự kiện mà sẽ nhảy khi tôi nhấp vào tiêu đề cột trong khi chỉnh sửa nội tuyến một hoặc nhiều hàng? (Một sự kiện mà tôi có thể có thể loại bỏ các chỉnh sửa, trước khi sắp xếp các nội dung)

Cảm ơn, Catalin

Trả lời

7

Một câu hỏi thú vị! +1 từ tôi.

Sự cố với việc sắp xếp các hàng hoặc ô chỉnh sửa bao gồm trong quyền truy cập vào hộp chứa các ô chỉnh sửa. Mã hiện tại của jqGrid không làm điều này và do đó bên trong trình xử lý sự kiện click trên các tiêu đề cột có kiểm tra xem có bất kỳ đường chỉnh sửa nào trong lưới không. Nếu một số dòng/dòng chỉnh sửa tồn tại thì sắp xếp sẽ bị dừng mà không cần để gọi số onSortCol gọi lại.

Vì vậy, chỉ có cách thứ hai trong đó một lưu hoặc khôi phục các ô chỉnh sửa trước khi sắp xếp là có thể. Để thực hiện điều này, có một vấn đề nhỏ. Nếu một liên kết bổ sung sự kiện click trên tiêu đề cột, nó sẽ được gọi là sau trình xử lý tiêu chuẩn ràng buộc trước đó của jqGrid. Vì vậy, người dùng không thể lưu hoặc hủy chỉnh sửa đã thay đổi trước sự kiện nhấp chuột sẽ được xử lý. Người ta có thể khắc phục vấn đề theo hai cách: một trong hai cách có thể gọi hàm sortData từ trình xử lý sự kiện mới hoặc người ta nên thay đổi thứ tự của các ràng buộc cho sự kiện click. Mã sau đây minh họa cách tiếp cận thứ hai:

$.each($grid[0].grid.headers, function() { 
    var $th = $(this.el), i, l, clickHandler, clickHandlers = [], 
     currentHandlers = $th.data('events'), 
     clickBinding = currentHandlers.click; 

    if ($.isArray(clickBinding)) { 
     for (i = 0, l = clickBinding.length; i < l; i++) { 
      clickHandler = clickBinding[i].handler; 
      clickHandlers.push(clickHandler); 
      $th.unbind('click', clickHandler); 
     } 
    } 
    $th.click(function() { 
     var p = $grid[0].p, savedRow = p.savedRow, j, len = savedRow.length; 
     if (len > 0) { 
      // there are rows in cell editing or inline editing 
      if (p.cellEdit) { 
       // savedRow has the form {id:iRow, ic:iCol, name:nm, v:value} 
       // we can call restoreCell or saveCell 
       //$grid.jqGrid("restoreCell", savedRow[0].id, savedRow[0].ic); 
       $grid.jqGrid("saveCell", savedRow[0].id, savedRow[0].ic); 
      } else { 
       // inline editing 
       for (j = len - 1; j >= 0; j--) { 
        // call restoreRow or saveRow 
        //$grid.jqGrid("restoreRow", savedRow[j].id); 
        $grid.jqGrid("saveRow", savedRow[j].id); 
       } 
      } 
     } 
    }); 
    l = clickHandlers.length; 
    if (l > 0) { 
     for (i = 0; i < l; i++) { 
      $th.bind('click', clickHandlers[i]); 
     } 
    } 
}); 

nơi $grid được định nghĩa là var $grid = $("#list"). Bạn có thể xem trực tiếp cách hoạt động trên the following demo.

+0

cảm ơn bạn rất nhiều, tôi sẽ thử nó –

+0

hoạt động tuyệt vời. cảm ơn một lần nữa. –

+0

@CatalinFlorea: Bạn được chào đón! – Oleg

1

Nếu bạn muốn thử tùy chọn 2, bạn có thể móc vào sự kiện onSortCol. Trong đó bạn có thể hủy bỏ chế độ chỉnh sửa của tất cả các hàng và sau đó cho phép sắp xếp để thực thi. Chỉ cần chắc chắn không trả lại "stop" hoặc sắp xếp sẽ không xảy ra chút nào.

Tăng lên ngay sau khi cột có thể sắp xếp được nhấp và trước khi sắp xếp dữ liệu.

Bạn có thể nhận tất cả tài liệu here.

+0

Đã thử. Nó không kích hoạt trong khi chỉnh sửa các hàng lưới. –