2012-06-04 98 views
2

我使用jqGrid 4.3.2和inlineNav選項。網格上的所有編輯均使用loadonce: trueclientArray在本地完成。用戶完成編輯後,他們單擊表單上的保存按鈕,並將整個網格發佈到服務器。這在很大程度上很有用,但我遇到了一個怪事。如果用戶添加新行,然後在點擊確認編輯或取消選擇新添加的行之前單擊保存按鈕,即使在發佈和重新加載之前調用saveRow,內聯導航器上的添加按鈕仍然保持禁用狀態。我在saveRow調用後嘗試過resetSelectionrestoreRow,但這兩種都不起作用。我的保存代碼:jqGrid with inlineNav:有沒有辦法強制添加按鈕重新啓用?

$("#submitButton").click(function() { 
    $("#theGrid").jqGrid('saveRow', $("#selectedRowId").val(), false, 'clientArray'); 
    if (!ValidateGridData()) 
     return false; 
    var rowData = $("#theGrid").jqGrid('getRowData'); 
    var dataToSend = JSON.stringify(rowData); 
    $.ajax({ 
     url: '@Url.Action("UpdateGridData")', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     data: dataToSend, 
     dataType: 'json', 
     async: false, 
     success: function (data, textStatus, jqXHR) { 
      $("#theGrid").jqGrid('setGridParam', { datatype: 'json' }); 
      $("#theGrid").trigger('reloadGrid'); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert('Error saving data: ' + textStatus + " " + errorThrown); 
     } 
    }); 
    return true; 
}); 

有沒有一種方法可以說服內聯導航器保存新行,並且用戶可以添加更多行?

回答

5

inlineNav方法在導航添加的按鈕具有從格柵ID構成的ID和相應的後綴:

  • 添加:gridId +「_iladd」(例如「list_iladd」)
  • 編輯:gridId + 「_iledit」(例如 「list_iledit」)
  • 節省:gridId + 「_ilsave」(例如 「list_ilsave」)
  • 取消:gridId + 「_ilcancel」(例如 「list_ilcancel」)

要啓用按鈕,您應該刪除'ui-state-disabled' CSS類:

var gridId = "list"; 
$("#" + gridId + "list_iladd").removeClass('ui-state-disabled'); 

要禁用按鈕可以使用.addClass('ui-state-disabled')來代替。

此外,我不建議您直接使用任何內聯編輯方法,如saveRow。在這種情況下,您可能不會遇到您嘗試解決的問題。看看the answer的代碼。它定義editingRowIdmyEditParam作爲

var $grid = jQuery("#list"), 
    editingRowId, 
    myEditParam = { 
     keys: true, 
     oneditfunc: function (id) { editingRowId = id; }, 
     afterrestorefunc: function (id) { editingRowId = undefined; } 
    }; 

然後用inlineNavmyEditParam參數:

$grid.jqGrid('inlineNav', '#pager', 
    { edit: true, add: true, editParams: myEditParam, 
     addParams: {addRowParams: myEditParam } }); 

在這種情況下,你可以肯定的是editingRowId讓你在當前編輯行或undefined如果的編號行正在編輯。因此,您可以使用$(gridIdSelector + "_iledit").click();而不是editRow編輯當前選定的行。在相同的情況下,如果需要可以使用setSelection,並模擬點擊任何其他內聯編輯導航器按鈕。

修訂:如果你需要,你還可以結合saveRow電話onSelectRow內,但您可以先使用可變editingRowId和秒用myEditParam這將是您使用所有的編輯方式共同

onSelectRow: function (id) { 
    var $this = $(this); 
    if (editingRowId !== id) { 
     if (editingRowId) { 
      // save or restore currently editing row 
      $this.jqGrid("saveRow", editingRowId, myEditParam); 
      // or $this.jqGrid("restoreRow", editingRowId, myEditParam); 
     } 
     $this.jqGrid("editRow", editingRowId, myEditParam); 
    } 
} 

如果您需要內聯編輯方法的其他選項,您可以在其中包含myEditParam。你會發現editingRowId在使用lastSel變量時效果要好得多,你可以在最內嵌的編輯示例中找到它。

+0

我只是朝着那條路走,除了在attr('class')'而不是'.removeClass'上使用了一個草率的'replace'。完美的作品。謝謝! –

+0

@AJ:不客氣! – Oleg

+0

Oleg,我一直在考慮你的關於不直接使用saveRow的額外評論。我正在使用'onSelectRow'來調用之前選擇的行上的'saveRow',類似於http://stackoverflow.com/q/2359011/27457中的代碼。「你不推薦使用這種方法嗎? –

相關問題