2012-06-26 51 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)。 –

相关问题