UltraWebGrid根據CheckBox在客戶端刪除行

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章