UltraWebGrid根据CheckBox在客户端删除行

来源:互联网 发布:手机图纸软件 编辑:程序博客网 时间:2024/04/30 06:29
UltraWebGrid根据CheckBox在客户端删除行

一、要实现的目标
将UltraWebGrid的首列设为CheckBox,用CheckBox标出要删除的行,然后再按“删除”按钮进行删除。
二、基本思路
循环Grid中的所有行,判断CheckBox的值是否为真,如为真则删除当前行。
三、遇到的问题和解决方法
1、在判断CheckBox的值是否为真时,使用语句:if(row.Cells.FromKey("ifselect").getValue) row.deleteRow();出现问题,无论选没

选中都被删除,或者都没删除(JavaScript语句出错)。最后查找到原因是未将dataType设置成Boolean类型。
注:在UltraWebGrid中使用checkbox除了要设置type=checkbox外,还要设置datatype=Boolean
2、在删除行时,选中的行总不能完全删除,需要多次点击删除按钮才能完全将选中的行删掉。这个问题困扰了我好几天,代码如下:
function btnDelete_Click(oButton, oEvent){

    var grid=igtbl_getGridById("<%= me.UltraWebGrid1.ClientID %>");

    for(var i=0;i<grid.Rows.length;i++){

        var rw=grid.Rows.getRow(i);

        var isSel=rw.getCellFromKey("ifselect").getValue();

        if (isSel) rw.deleteRow();
    }

}

感觉程序写的没错啊,逐行判断逐行删除。怎么就会漏删了呢?随后跟踪调试,发现循环次数不对,明显少于应该循环的次数。再跟踪各变量

,最后找到grid.Rows.length这个值有问题,它不是个固定值,而是会随着循环次数的增加而减少,导致整个for循环次数没有达到指定的次

数。到底是什么改变了length这个值?这不是一个定值吗?一旦grid生成这个值就是不变的啊!冥思苦想也没有结果,网上查了很多资料也没

找到答案。后来单步执行时发现,deleteRow()以后,页面中的Grid会立即减少一行。于是,估计是在执行rw.deleteRow()后

grid.Rows.length发生了变化,用grid.Rows.remove(i,true)也是同样结果。但是怎么来解决这个问题?怎么能在length改变后也能循环到

第一行呢?又是一个头疼的问题!又查了很多资料,都没有好的或者情况相似的解决方法。
有变样的方法的:
function delete() {   
    //get the first row in the grid
    var row=igtbl_getRowById("UltraWebGrid1r_0");
    //delete the first row in the grid
    igtbl_deleteRow("UltraWebGrid1","UltraWebGrid1r_0");
    //create a counter for the row id
    var cnt=0;
    //create a loop, if the row has a next sibling then we need to delete it
    while(row.NextSibling!=null)    {
        //increment the counter for the next rowID
        cnt+=1;        //get the row current row using the name of the grid and the row
                 //number from our counter so we can check it for a sibling
        row=igtbl_getRowById("UltraWebGrid1r_"+cnt)        //finally delete that row,
        igtbl_deleteRow("UltraWebGrid1","UltraWebGrid1r_"+cnt);
    }
}
这种方法是把所有行都删除,不是我想要的。
另外的还有:
All the selected rows within the grid can be deleted as well. For deleting selected rows, use the following function:

igtbl_deleteSelRows(gridName).
igtbl_deleteSelRows("UltraWebGrid1");
可以改造上面的函数,将符合条件和行设为selected,然后调用igtbl_deleteSelRows()方法一次性删除所用的行。这种方法我试了一下,但

中途放弃了。不过这确是一种思路。另外用这种方法必须设置UltraWebGrid能选择多行,我就是在这卡住了。而且这里直接使用

UltraWebGrid的ClientID也不是我喜欢的一种。
另外试过一些方法,比如在服务器端删除,但都不能完全删除。一时间不知道怎样解决这个问题,怎样才能每一行都循环到。

今天再次打开,发现选择连续的两行必有一行漏删,而隔一行选择,则所有选中的行都能被删除,先试了奇数行再试了偶数行,都能完全删除

,然后再单步,发现删除一行后grid.Rows.length就会自动减一,但是 i 还是继续往下计数,而获取一行是用grid.Rows.getRow(i)方法,怎

样让 i 保持不变还是停在被删除的那一行,不就所有行都能历遍了吗?既然i++使i增加1,那么再将i减一不就可以了吗?于在deleteRow()后

添加一句i--,问题终于成功解决!终于得到我想要的结果和效果!怎样选择都将选中的一次删掉,不多删也不漏删!高兴啊……

function btnDelete_Click(oButton, oEvent){

    var grid=igtbl_getGridById("<%= me.UltraWebGrid1.ClientID %>");
   
    for(var i=0;i<grid.Rows.length;i++){

        var rw=grid.Rows.getRow(i);

        var isSel=rw.getCellFromKey("ifselect").getValue();

        if (isSel){

         rw.deleteRow(); //或者用grid.Rows.remove(i,true)

         i--;             //非常重要,grid在删除一行后,grid.Rows.length会减一

        }

    }

}

 

   连接:http://hi.baidu.com/lostparadise/blog/item/1f23aaec1563e72463d09f14.html