2010-08-05 538 views
4

place_id的custom_value设置为我首先点击的任何一行。后续点击的行将全部使用相同的值,而不管它们的实际值如何。为什么?jqgrid - 设置edittype的custom_value:'custom'

例如:

place_id foo_name bar_value 
    10  blah  abc 
    11  blah2  fgr 

单击该行与10 place_id,然后单击“编辑”,并在出现将有10为place_id价值形态。进行更改并保存,然后单击下一行。尽管所有其他值都是正确的,但表格仍然会有10的place_id。

我的代码:

列place_id看起来是这样的:

{name:'place_id', index:'place_id', editable: true, edittype:'custom', 
editoptions: { custom_element:myelem,custom_value:myval }} 

myval功能是:

function myval(elem){ 
    return elem.val(); 
} 

我需要的是对于设为myVal设置为正在编辑的行的正确place_id。我查看了Firebug中的elem对象,我发现它始终具有任何第一次点击行的值,但我不明白为什么也没有看到我可以从哪里获取正确的值。任何建议表示赞赏(我试图问jqgrid论坛上,但没有什么,所以我转向stackoverflow)。

*编辑:如果我使用edittype:'text'而不是edittype:'custom',我会得到显示并通过的正确值,但这个列是可编辑的,它应该只可见但不可编辑。

全码:

jQuery(document).ready(function(){ 
    jQuery("#list").jqGrid({ 
     url:'/foo/bar/results', 
     datatype: 'json', 
     mtype: 'POST', 
     colNames:['Place ID', 'Site ID', 'Site Name', 'API ID', 'M Type'], 
     colModel :[ 
      {name:'place_id', index:'place_id', key: true, sorttype:'integer', 
      width:70, editable: true, edittype:'custom', 
      editoptions: {custom_element:myelem,custom_value:myval }}, 
      {name:'site_id', index:'site_id', sorttype:'integer', width:70, 
      editable: true, edittype: 'select', editrule: {required: true}, 
      editoptions:{value:getSites(), size:30}}, 
      {name:'site_name', index:'site_name', width:150, editable: false, 
      editrule: {required: true}, editoptions: {size:30}}, 
      {name:'api_id', index:'api_id', sorttype:'integer', width:75, 
      editable: true, edittype: 'text', editrules: {required: true}, 
      editoptions:{size:30}}, 
      {name:'m_type', index:'m_type', width:150, editable: true, 
      edittype: 'select', editrules: {required: true}, 
      editoptions:{value:{'one':'one','two':'two','three':'three', 
           'four':'four'},size:30}} 
     ], 
     editurl:'/foo/bar/editinfo',  
     height: 'auto', 
     width: 'auto', 
     pager: '#pager', 
     viewrecords: true, 
     loadonce: true, 
     rowNum:20, 
     rowList:[20,40,60,80,100], 
     caption: 'Meter Listing' 
    }); 

    // Edit functionality 
    $("#editfields").click(function(){ 
     var gr = jQuery("#list").jqGrid('getGridParam','selrow'); 
     if(gr != null) { 
      jQuery('#list').setGridParam({datatype:'json'}); 
      jQuery("#list").jqGrid('editGridRow',gr, 
          {editCaption: 'Edit Place Details',height:550, 
          closeAfterEdit:true,width:600,reloadAfterSubmit:true}); 
     } else { 
      alert("Please select a row"); 
     } 
    }); 
}); 

function myelem(value,options){ 
    return $('<input type="text" value="'+value+'" disabled="disabled"/>'); 
} 

function myval(elem){ 
    return elem.val(); 
} 

EDIT2:

getSites:

function getSites(){ 
    <?php 
    $sites = "0:Select"; 
    foreach ($this->sites as $k => $v){ 
     $sites = $sites . ";" . $v['site_id'] . ":" . $v['site_name']; 
    } 
    ?> 
    return "<?= $sites ?>"; 
} 
+0

你能否发布'myelem'函数的代码? – Oleg 2010-08-05 16:30:12

+0

增加了...虽然我真的不知道'价值'来自哪里...... hmmm和'options'甚至没有被使用。 – Stuart 2010-08-05 16:38:53

+0

你可以发布'getSites'函数的代码吗? – Oleg 2010-08-05 17:30:58

回答

5

你能尝试包括key: trueplace_id列的定义。您可以从您从服务器发送的数据中删除id

如果它不会帮助,那么你应该发布一个完整的代码示例,重现您的问题,我会尝试找到一个解决方法。

已更新:有时候对于复杂问题有一个简单的解决方案。 editGridRow功能的一个附加参数解决您的问题:

recreateForm: true 

如果不使用参数的功能myelem将在选定行的第一个编辑被称为一次。然后表单将被缓存,并且不会被重新创建。所以你会被编辑在同一行。在包含参数recreateForm: true后,将每次创建表格

顺便说一句我设置我在所有jqGrids每延长jQuery.jgrid.defaultsjQuery.jgrid.editjQuery.jgrid.viewjQuery.jgrid.deljQuery.jgrid.nav使用一些常规设置。例如我总是使用

jQuery.extend(jQuery.jgrid.edit, { 
    closeAfterAdd: true, 
    closeAfterEdit: true, 
    recreateForm: true, 
    //... 
}); 

然后我不需要以后设置这个参数。在编写关于自定义编辑的答案Add multiple input elements in a custom edit type field时,我也有设置,所以我没有看到任何问题。

+0

'key:true'没有帮助。我添加了一个更完整的代码示例。谢谢你看这个,奥列格。 – Stuart 2010-08-05 16:37:25

+0

我加了'getSites'。 – Stuart 2010-08-05 18:25:11

+0

如果我刷新页面,可以再次选择place_id,并且对于第一个选择将是正确的。但在那之后,问题仍然存在。只有重新加载页面才有效。 – Stuart 2010-08-05 18:32:11