2012-06-26 52 views
6

我正在使用jqGrid 4.4.0進行內聯編輯。爲了這個問題,我的網格有四列:ID列(SomeGridRowId),帶有jQuery自動完成(Autocomplete)的文本列,單個字符文本列(SingleChar)和隱藏列(CanEditSingleChar)。我需要根據CanEditSingleChar列的值啓用或禁用單字符列的編輯。我已經在使用onSelectRowsetColProp的現有行上工作,但出於某種原因,我無法在新插入的行上使其正常工作。如果我添加一個新行並從自動完成中選擇一個值,SingleChar列是總是不可編輯。我使用Chrome和IE開發人員工具瀏覽了Javascript;列值和屬性得到正確設置,但SingleChar列的editable屬性不反映此情況。根據另一列中的自動完成結果更改jqGrid文本列的可編輯屬性

我爲巨大的代碼片斷表示歉意,但我不想留下任何東西。

$("#coolGrid").jqGrid({ 
    url: '@Url.Action("GetCoolGridData")', 
    postData: { 
     someId: function() { return $("#someId").val(); }, 
     otherStaticArg: function() { return 1; } 
    }, 
    datatype: 'json', 
    mtype: 'POST', 
    loadonce: true, 
    cellsubmit: 'clientArray', 
    editurl: 'clientArray', 
    scroll: true, 
    pager: $("#coolGridPager"), 
    rowNum: 200, 
    sortname: 'SomeGridRowId', 
    sortorder: 'asc', 
    viewrecords: true, 
    height: '100%', 
    colNames: ['SomeGridRowId', 'CanEditSingleChar', 'Autocomplete', 'SingleChar'], 
    colModel: [ 
     { name: 'SomeGridRowId', index: 'SomeGridRowId', hidden: true }, 
     { name: 'CanEditSingleChar', index: 'CanEditSingleChar', hidden: true }, 
     { 
      name: 'Autocomplete', 
      index: 'Autocomplete', 
      width: 220, 
      editable: true, 
      edittype: 'text', 
      editoptions: { 
       dataInit: function (elem) { 
        $(elem).autocomplete({ 
         source: '@Url.Action("GetSomeGridAutocomplete")', 
         minLength: 2, 
         select: function (event, ui) { 
          var rowId = getRowId($(this)); 
          if (ui.item) { 
           $("#coolGrid").jqGrid('setCell', rowId, 'CanEditSingleChar', ui.item.CanEditSingleChar, '', ''); 
           $("#coolGrid").jqGrid('setCell', rowId, 'Autocomplete', ui.item.label, '', ''); 
           setSingleCharEditMode(rowId); 
          } 
         } 
        }); 
       } 
      } 
     }, 
     { 
      name: 'SingleChar', 
      index: 'SingleChar', 
      width: 10, 
      editable: true,  //default to true, most are editable 
      edittype: 'text' 
     } 
    ], 
    onSelectRow: function (clickedRow) { 
     if (clickedRow && clickedRow != $.coolGridLastSelectedRow) { 
      $("#coolGrid").jqGrid('saveRow', $.coolGridSelectedRow, false, 'clientArray'); 
      $.coolGridLastSelectedRow = clickedRow; 
     } 
     setSingleCharEditMode($.coolGridLastSelectedRow); 
     $("#coolGrid").jqGrid('editRow', $.coolGridLastSelectedRow, true); 
    }, 
    afterInsertRow: function (rowid, rowdata, rowelem) { 
     if (rowid == 'new_row') {  //shown solely for completeness, pretty sure this is not the problem 
      var newRowIndex = $("#coolGridNewRowIndex").val(); 
      if (!newRowIndex) 
       newRowIndex = 1; 
      var newRowId = rowid + "_" + newRowIndex; 
      $("#new_row").attr('id', newRowId); 
      newRowIndex++; 
      $("#coolGrid").val(newRowIndex); 
      $("#coolGrid").jqGrid('setSelection', newRowId, true); 
     } 
    } 
}); 
$("#coolGrid").jqGrid('navGrid', '#coolGridPager', 
{ 
    add: false, 
    del: false, 
    edit: false, 
    search: false, 
    beforeRefresh: function() { 
     $("#coolGrid").jqGrid('setGridParam', { datatype: 'json' }); 
    } 
}); 
$("#coolGrid").jqGrid('inlineNav', '#coolGridPager', 
{ 
    edit: false, 
    add: true, 
    addtext: "Add", 
    save: false, 
    cancel: false, 
    restoreAfterSelect: false, 
    addParams: { 
     position: 'last', 
     addRowParams: { 
      keys: true 
     } 
    } 
}); 

而且setSingleCharEditMode功能:

function setSingleCharEditMode(rowid) { 
    var rowData = $("#coolGrid").jqGrid('getRowData', rowid); 
    if (rowData.CanEditSingleChar === "false") { 
     $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: false }); 
    } else { 
     $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: true }); 
    } 
} 

我試過的東西,整體轉換,通過一堆其他SO問題膛線,一派瘋狂....都無濟於事。我已經使出了我的頭髮。我如何控制另一列上的自動完成select之後的一列中的editable屬性,全部在新行上?

編輯
我有一個working example up here,終於。如果添加一行,然後選擇​​3210列中的任意一個「非典型*」,則可以重現此行爲。

回答

6

沒有一個實際的例子,很難說出爲什麼新添加的行不能被編輯。另外,由於jqGrid和其他依賴關係,我自己很難整理一個簡單的工作示例(例如,在jsfiddlejsbin)。通過您的代碼,這可能有助於(或可能是什麼新的東西,你已經嘗試過)照看

幾個問題:

  • addRow - 你如何添加行,使用addRow function?其他所有「jqGrid related」是否與新添加的行一起工作,即它是否正確初始化?使用datatables我遇到了一些問題。

  • 正確/唯一的行ID? - 您是否檢查過rowid對於新行是唯一的,並且您的 代碼是使用正確的代碼執行的(即來自新行的id)?你有沒有把console.log陳述放進setSingleCharEditMode看看發生了什麼(只是爲了確定,你說你已經完成了代碼)?

    你可能會設置一個單元格的editable財產 另一行(思考它:這不可能吧,因爲電池應該是默認的編輯和明確地設置爲不被你的代碼編輯)。將該行的顏色與editable屬性一起更改以輕鬆查看正在處理的單元格/行。

  • 默認情況下工作嗎? - 由於editable的默認值爲true:您是否嘗試過 禁用setSingleCharEditMode並且默認情況下可以編輯 ?也許這個問題不是你的評估,而是該行本身的增加 ?

  • 正確的類型? - 在setSingleCharEditMode中,您使用字符串「false」測試strict equality的列值。您確定 的值與現有和新行具有相同的類型(應該是,因爲它們是 字符串,並通過相同的jqGrid代碼進行分析:getRowData)? 我想你已經有console.log在功能廣泛GED看到正在發生的事情與傳遞的id和設置editable財產

希望這有助於一點點地找到問題的比較。正如我所說的,如果沒有一個可行的例子,真的很難調試。你可能想在某個地方放一個。

[工作示例後編輯]

我看到的是,如果你在現有的 編輯行選擇「非典型性狂躁症」,同樣的行爲適用

的第一件事。另外:添加可編輯的行(雙極的東西)的作品。這似乎不是「新行」與「現有行」的問題。更像是一個可編輯的行被更改爲不可編輯的問題。

我的猜測是,這種情況正在發生:

  1. 要添加新的行,列SingleChar默認爲可編輯的,所以顯示的<input>
  2. 您評估服務器響應並將自動完成select處理程序中的列設置爲editable : false
  3. 您取消行的jqGrid恢復所有然後編輯的行,所以不碰SingleChar,因爲它認爲SingleChar並不需要重置爲初始狀態..

我有道理嗎?

嘗試設置editablefalse jqGrid重置行或自行刪除<input>後。

+0

謝謝你的深思熟慮的迴應。我正在努力在線獲取示例。 –

+0

你有沒有進展?你怎麼看待分配這個賞金?我認爲在寬限期結束之前不會再有任何答案。 – Wolfram

+0

對不起,Wolfram,上週忙碌的一週,我沒有時間去完成一個完整的工作範例。我希望今天能夠處理它,但賞金卻是你的(儘管我不確定它爲什麼會將它分成100)。 –

相關問題