在未使用idField:'id' ,即以id来作为标记的时候,我们获取行索引index,必须以这条记录row来获取,可以使用一下方式来删除所有被勾选的记录:
function deleteObject(){ var node=$("#_list").datagrid("getChecked"); var arr = []; if (node.length>0){ for(var i=0;i<node.length;i++){ var index = $('#_list').datagrid('getRowIndex',node[i]);//以row来获取行号index $('#_list').datagrid('deleteRow',index); $('#_list').datagrid('selectRow',index); arr.push(index); } console.info(arr); } }
控制台显示:
如果设定了idField的情况下,其余所有代码没变,仍旧是删除最前面五条记录:
改动JS代码:
var index = $('#_list').datagrid('getRowIndex',node[i].id);//以row来获取行号index
会发现和以row行记录来获得index一致,此时第一种的删除方法出错。
结果显示:
总结:
(1)在没有设定idField的时候删除,貌似是删除一条记录后,再在新的datagrid数据中重新获得新的index行号,再进行删除,所以能够正确删除
(2)在设定了idField的时候,会发现索引是没有删除之前的行号,我们要做的就是模仿第一种删除方式来获得正确的行号来进行删除,所以先要获取没有删除之前所有被勾选的行记录的索引号,然后在循环删除,记得在删除一行之后,该行之后的被勾选的实际索引号相对于初始的索引号是-1的:
所以这么做:(注意(1)和(2)不能放一起,虽然看起来都是循环是一样的,但是在删除之后再去获得index行索引会出错)
1. 从前往后删除---需要考虑顺序问题
/** * 删除数据表格的记录并更新数据表 */ function deleteObject(){ var count=-1;//用来标记已经删除记录的次数,删除一次为0(对应被删除的第一条记录的实际索引号为index-0),删除两次为1(对应的第二条记录的实际索引号为index-1), var node=$("#_list").datagrid("getChecked"); var arr = [];//用来放置为删除之前的所有被勾选的初始索引号 var arr1 = [];//用来放置每条要被删除的记录的初始索引号对应的减数 if (node.length>0){ for(var i=0;i<node.length;i++){ (1) var index = $('#_list').datagrid('getRowIndex',node[i].id);//根据id标识查索引 count++; arr.push(index); arr1.push(count); } for(var i=0;i<arr.length;i++){ (2) $('#_list').datagrid('deleteRow',arr[i]-arr1[i]);//根据实际索引号来删除记录 } } console.info(arr); console.info(arr1); $('#_list').datagrid('selectRow',arr[arr.length-1]-arr1[arr1.length-1]);//选中最后被删除的记录的下一条记录 }
结果显示:
另外一种更简单的方法:
2.从后往前删除---不需要考虑顺序问题
function deleteObject(){ var node=$("#_list").datagrid("getChecked"); var rows = $('#_list').datagrid('getRows'); var rowsLen = rows.length; var nodeLen = node.length; if (node.length>0) { for(var i=node.length-1;i>=0;i--) { var row=node[i]; var rowIndex=$("#_list").datagrid("getRowIndex",row); if(i==nodeLen-1){//如果删除的是被勾选的最下面一条记录 if(rowsLen-1>rowIndex){//如果该记录不是最后一条 $('#_list').datagrid('clearSelections');//必须加上这样,否则如果被删除的行是最后一行,那么即使表面上已经没有选择的行,但是在利用datagrid("selectRow")的时候会发现得到的是被是删除的最后一行,所以先清除再选择 $("#_list").datagrid("selectRow",rowIndex+1);//选中被删除的最后一行的下一条记录 } } $("#_list").datagrid("deleteRow",rowIndex); } } }