datatable刪除行


先列出正確的寫法,如果你只想馬上改錯就先復制吧,

protected void deleteDataRow(int RowID,DataTable dt)  
    {  
        for (int i = dt.Rows.Count - 1; i >= 0; i--)  
        {  
            if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID)  
                dt.Rows.RemoveAt(i);  
        }  
    }  /* 何問起 hovertree.com */

如果你有時間想學習一下就繼續看下面列出可能出錯的可能性吧。

  1.如果只是想刪除datatable中的一行,可以用DataRow的delete,但是必須要刪除后讓DataTable知道,所以就要用到.AcceptChanges()方法,原因是這種刪除只是標識性刪除,就像我們通常在數據庫中用到的IsDelete字段。

  2.徹底刪除就要用到datatable的.Rows.Remove(DataRow dr)方法,同理也只是刪除一行可以,如果要循環刪除請繼續往下看。

  3.循環徹底刪除就要用.Rows.RemoveAt(int index)方法,所以如果你是foreach的愛好者,在此請你換換口味,還有如果你是for的i++的忠實fans也希望你能換個思維。先看一下上面程序的正向寫法(錯誤的,不可用)

for (int i = 0, j = dt.Rows.Count; i < j; i++)  
        {  
            if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID)  
                dt.Rows.RemoveAt(i);  
        }  /* 何問起 hovertree.com */

這個的錯誤在於datatable的RemoveAt()會在刪除后更新dataTable的index,所以你要刪除的index可能已經不是你的符合Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID的index了,甚者還會拋出異常,說你訪問的index不存在。

  所以要從DataTable的下面往上查找刪除,這樣即使這行符合條件被刪除了,上面的行依舊不受影響。

說了這么多,不知道你明白了嗎?其實現在寫這種文章顯得有點"弱智",技術學多了,越來越覺得自己的基礎不夠扎實,希望通過在此記錄一下可以督促一下自己,也希望能給初學者帶去絲絲幫助。

 http://hovertree.com/menu/csharp/

 

操縱dataset
在DataSet中DataRow是其所有數據的基本存放位置,它主要是由一個值數組組成,代表DataTable單獨一行。
DataRow中主要包括一下幾種信息:1、行中每一列的當前值,2、行中每一列的原始值,3、行狀態,4、父行與子行間的鏈接

初始化一個DataRow:
DataTable dataTable=dataSet.Tables[0];
DataRow newRow=dataTable.NewRow(); //用dataTable生成DataRow可以利用dataTable里面的模式
dataTable.Rows.Add(newRow);

刪除行:
DataTable.Rows.Remove(行實例);
DataTable.Rows.RemoveAt(行號);
DataRow.Delete(); //行自身移除

讀寫DataRow的值:
row["列名"],row[列號]均可引用其中的一個屬性
DataColumn a=dataTable.Columns("列名"); //可以獲得一個列

對行進行批處理更改:
BeginEdit()開始更改,EndEdit()結束更改,同時將更改結果寫入DataSet,CancelEdit(),取消更改
例如:
row.BeginEdit();
對row進行更改
row.EndEdit();

http://www.cnblogs.com/roucheng/p/csfetch.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM