【NSBD】——datagrid多次选中记录问题

来源:互联网 发布:单位网络改造报价单 编辑:程序博客网 时间:2024/05/07 15:35

【项目需求】


       每个填报类型都可以绑定一个多个设施,但一个设施只能被一个填报类型绑定,即一个设施如果被填报类型A绑定后,便不可以被填报类型B绑定。还有就是当第二次添加设施时,第一次添加的设施在datagrid上进行选中显示,并且可以取消选中或选中其他设施。

       主要页面是这个样子的:





       点击添加按钮,弹出选择设施弹出框,选择设施,点击确定后,改变设施配置tab下的列表,之前的实现有一些问题,每一次添加都会删除之前添加的记录,然后重新添加,弹出框列表不会选中之前选中的行,而最终要改成上面的需求。

【解决思路】


       获取设施配置tab下的列表中的所有Id,传到选择设施页面,然后在选择设施页面表格加载成功后判断此页中是否有已经选中的Id值,如果有则进行选中操作,如果没有,则不进行操作。由于设施编号是唯一的,而之前的代码都是以设施编号来进行判断的,所以我们还是以设施编号来进行操作。


【代码实施】


      1、获取设施配置页面的所有facilityCode,然后拼接成json字符串,传给选择设施页面。
         
var objectNumArray=[]; //获取列表上每行的设施编号var rows=$('#ssTabs').datagrid('getRows');    //获得所有行for(var i=0;i<rows.length;i++){objectNumArray.push(rows[i].facilityCode);}var objectNums=JSON.stringify(objectNumArray);$('#ssWindow').window('open').window('refresh', MYPATH+'/nsbd/gcyw/inspect/configure/patrol_ss_list.jsp?type='+type+'&objectNums='+objectNums);


      2、在选择设施页面列表的onLoadSuccess事件中去解析传过来的json字符串,并进行循环判断去进行选中操作。


onLoadSuccess:function(data){   var objectnums=objectNums.replace(/"/g,'"');   //解析Json字符串   objectNumArray=JSON.parse(objectnums);        $.each(data.rows,function(i,e){   for(var j=0;j<objectNumArray.length;j++){   if (e.objectnum==objectNumArray[j]){   $('#sslist').datagrid('selectRow',i);   }      }      });   },


       在这里出现了一个小问题,就是我传过去的json字符串,本应该是双引号,为什么传过来竟然变成了&quat;????,所以我们要把替换的那行代码改为:


       

 var objectnums=objectNums.replace(/"/g,'"');


       3、修改保存方法,这里需要注意的有两点:一是我之前选择的行不能够被删除,而新选中的行也会在设施配置列表中显示。

       在这我就想了两个办法:


    (1)因为列表加载成功后,已经把我之前选过的行也进行选择了,我在点击保存的时候,获取所有选中行进行添加操作,之前的“每一次添加都会删除之前添加的记录”功能代码不做修改。

      由于$("#sslist").datagrid('getChecked')只能获取本页所选中的行,那我之前所选中的行如何添加呢?

     解决办法:之前不是从设施配置页面传过来了一个json字符串并解析成了objectNumArray数组嘛,那个就是我之前选中的行所有记录。就把现在选中的行和之前的进行合并到一个数组里面,如果有重复的记录就不添加。


var selects=$("#sslist").datagrid('getChecked');//得到所有的,然后保存var idArray=[];if (selects.length>0){$.each(selects,function(i,n){idArray.push(selects[i].objectnum);//idArray.push(selects[i].objectid);});for(var j=0;j<objectNumArray.length;j++){//if (objectNumArray[j]!=idArray[i]){//console.log($.inArray(objectNumArray[j],idArray));if ($.inArray(objectNumArray[j],idArray)=="-1"){idArray.push(objectNumArray[j]);}}}else{idArray=objectNumArray;}


      (2)之前添加的不做删除操作,判断哪些是新选中的行,获取新选中行的值进行添加操作。获取此页选择的行,将此次选择的行进行筛选。


for(var i=0;i<selects.length;i++){     if ($.inArray(selects[i],objectNumArray)=="-1"){idArray.push(selects[i]);}}

       这次idArray数组里面存放的就是新选择的行了。将后台的的删除方法去掉就可以了。


【有待完善】


       1、隔页的行如何进行一起添加,例如,每页有10条记录,我想添加第1条和第12条,可是当我选中第1条,进行翻页选择第12条的时候,在去看第一页的第1条,发现它并没有被选中。我想过用上面的方法去实现,但是如果选择的多的话,那岂不是我每翻一次页就要进行一次判断?


       2、关于“一个设施如果被填报类型A绑定后,便不可以被填报类型B绑定”,这个问题,我起初用的是弹出框,每当它选择了其它填报类型已经选择的设施后,就要提示他“该设施已经被XX填报类型绑定,请选择其它设施!”,后来我觉得既然它不能选,为什么还要让这条记录显示出来呢?那干脆datagrid加载的时候就只显示它能够选择的列表就行了。但是,如果填报类型B一定要选择设施(0)呢,但是列表中没有它,如果我没有提示,我不知道是被谁绑定了,我还得一个个的去查看修改,那么到底是需要提示呢?还是默默无闻的将其去除呢?


【总结】


        在改这个问题之前,组长还问过我,有没有做过【有待完善1】中的问题,我那个时候还没有什么想法,不知道怎么去实现,当自己遇到这个问题的时候,就突然有想法了,结果也是可以实现的,但我觉得这仅仅是可是实现而已,它并不是最优的解决方案。对于代码的优化这块还有待提高!!!

1 0