2009-05-30 39 views
33

Khi sử dụng jqGrid làm cách nào để bạn buộc một ô tải trong chế độ xem có thể chỉnh sửa của nó khi tải trang cũng như khi được nhấp?jqGrid với cột hộp kiểm có thể chỉnh sửa

Nếu bạn thiết lập 'chỉnh sửa ô' như dưới đây, hộp kiểm chỉ xuất hiện khi bạn nhấp vào ô.

{ name: 'MyCol', index: 'MyCol', editable:true, edittype:'checkbox', editoptions: { value:"True:False" }, 

cellEdit:true, 

Ngoài ra khi nhấp vào, có cách gửi bài đăng AJAX đến máy chủ ngay lập tức thay vì phải dựa vào người dùng nhấn enter không?

Trả lời

75

Để cho phép các hộp kiểm để luôn nhấp thể, sử dụng disabled tài sản định dạng hộp kiểm của:

{ name: 'MyCol', index: 'MyCol', 
    editable:true, edittype:'checkbox', editoptions: { value:"True:False"}, 
    formatter: "checkbox", formatoptions: {disabled : false} , ... 

Để trả lời câu hỏi thứ hai của bạn, bạn sẽ phải thiết lập một trình xử lý sự kiện cho các hộp kiểm, như vậy mà khi một là nhấp vào một chức năng được gọi là, ví dụ, gửi một POST AJAX đến máy chủ. Dưới đây là một số mã ví dụ để giúp bạn bắt đầu. Bạn có thể thêm video này vào sự kiện loadComplete:

// Assuming check box is your only input field: 
    jQuery(".jqgrow td input").each(function(){ 
     jQuery(this).click(function(){ 
      // POST your data here... 
     }); 
    }); 
+1

@Justin Great câu trả lời !! Cảm ơn, nếu đó là câu hỏi của tôi, tôi sẽ cho bạn đánh dấu. – Dan

+4

Tuyệt vời! Tôi ước tôi có thể đánh dấu câu trả lời này là câu trả lời đã chọn! – Nigel

+1

Bạn được chào đón! Đó là một sự xấu hổ câu hỏi này là quá cũ, nhưng hy vọng câu trả lời vẫn có thể hữu ích :) –

6

Đây là một cái cũ nhưng có rất nhiều điểm vì vậy tôi quyết định thêm giải pháp của tôi ở đây quá.

Tôi đang sử dụng hàm .delegate của JQuery để tạo triển khai ràng buộc muộn sẽ giải phóng bạn khỏi nghĩa vụ sử dụng sự kiện loadComplete.

Chỉ cần thêm những điều sau đây:

$(document).delegate('#myGrid .jqgrow td input', 'click', function() { alert('aaa'); }); 

này sẽ trễ ràng buộc xử lý mà cho tất cả các hộp kiểm đó là trên các hàng lưới. Bạn có thể gặp sự cố ở đây nếu bạn có nhiều cột hộp kiểm.

+0

+1 cho bạn, mẹo hay! –

+0

Làm cách nào bạn xử lý trường hợp có nhiều cột hộp kiểm trong mỗi hàng? – d512

+0

@ user1334007 Nó thực sự phụ thuộc vào những gì bạn đang làm. Nếu bạn đang sử dụng chức năng chỉnh sửa nội tuyến của lưới, bạn vẫn có thể sử dụng ở trên và xác định cái nào được nhấp bằng cách nhận ID của nó. Mặc định, jqGrid đặt ID hộp kiểm là "[rowid] _ [colname]". Vì vậy, từ ID của hộp kiểm, bạn sẽ có thể biết được hộp kiểm hàng/cột nào. – AlexCode

3

tôi đã cùng một vấn đề và tôi giả sử rằng tôi tìm thấy một giải pháp tốt để xử lý các hộp kiểm bấm ngay lập tức. Ý tưởng chính là kích hoạt phương thức editCell khi người dùng nhấp vào hộp kiểm không thể chỉnh sửa. Đây là mã:

 jQuery(".jqgrow td").find("input:checkbox").live('click', function(){ 
      var iRow = $("#grid").getInd($(this).parent('td').parent('tr').attr('id')); 
      var iCol = $(this).parent('td').parent('tr').find('td').index($(this).parent('td')); 
      //I use edit-cell class to differ editable and non-editable checkbox 
      if(!$(this).parent('td').hasClass('edit-cell')){ 
            //remove "checked" from non-editable checkbox 
       $(this).attr('checked',!($(this).attr('checked'))); 
         jQuery("#grid").editCell(iRow,iCol,true); 
      } 
    }); 

Ngoại trừ điều này, bạn nên xác định sự kiện cho lưới của bạn:

  afterEditCell: function(rowid, cellname, value, iRow, iCol){ 
      //I use cellname, but possibly you need to apply it for each checkbox  
       if(cellname == 'locked'){ 
       //add "checked" to editable checkbox 
        $("#grid").find('tr:eq('+iRow+') td:eq('+iCol+') input:checkbox').attr('checked',!($("#regions").find('tr:eq('+iRow+') td:eq('+iCol+') input:checkbox').attr('checked'))); 
          //trigger request 
        jQuery("#grid").saveCell(iRow,iCol); 
       } 
      }, 

      afterSaveCell: function(rowid, cellname, value, iRow, iCol){ 
       if(cellname == 'locked'){ 
        $("#grid").find('tr:eq('+iRow+') td:eq('+iCol+')').removeClass('edit-cell'); 
       } 
      }, 

Sau đó, hộp kiểm của bạn sẽ gửi yêu cầu chỉnh sửa mỗi khi người dùng nhấp vào nó.

2

Tôi có một chức năng gửi gửi tất cả các hàng lưới tới máy chủ web.

tôi giải quyết vấn đề này sử dụng mã này:

var checkboxFix = []; 
$("#jqTable td[aria-describedby='columnId'] input").each(function() { 
     checkboxFix.push($(this).attr('checked')); 
}); 

Sau đó, tôi trộn với giá trị nhận được từ các mã dưới đây.

$("#jqTable").jqGrid('getGridParam', 'data'); 

Tôi hy vọng nó sẽ giúp ai đó.giải pháp

+0

Cảm ơn Richard, nhưng tôi thấy điều này không hoàn toàn hiệu quả. Hộp kiểm của tôi nằm trong cột đầu tiên của jqGrid của tôi, nhưng nếu người dùng nhấp vào trong một ô trong cột thứ nhất, nhưng không phải trên hộp kiểm, thì mã này sẽ kích hoạt không đúng chức năng "giá trị hộp kiểm đã thay đổi". Những gì đã làm việc cho tôi là: $ ('# jqGrid'). On ('change', ': checkbox', function (e) {}); –

0

tốt hơn:

<script type="text/javascript"> 
    var boxUnformat = function (cellvalue, options, cell) { return '-1'; }, 
     checkboxTemplate = {width:40, editable:true, 
      edittype: "checkbox", align: "center", unformat: boxUnformat, 
      formatter: "checkbox", editoptions: {"value": "Yes:No"}, 
      formatoptions: { disabled: false }}; 
    jQuery(document).ready(function($) {   
     $(document).on('change', 'input[type="checkbox"]', function(e){ 
      var td = $(this).parent(), tr = $(td).parent(), 
       checked = $(this).attr('checked'), 
       ids = td.attr('aria-describedby').split('_'), 
       grid = $('#'+ids[0]), 
       iRow = grid.getInd(tr.attr('id')); 
       iCol = tr.find('td').index(td); 
      grid.editCell(iRow,iCol,true); 
      $('input[type="checkbox"]',td).attr('checked',!checked); 
      grid.saveCell(iRow,iCol); 
     }); 
    }); 
</script> 

Trong colModel của bạn:

... 
{name:'allowAccess', template: checkboxTemplate}, 
... 
Các vấn đề liên quan