DataTable使用技巧:DataRowState


DataGridView:獲取 DataRow 對象的狀態,共有5個枚舉值。

Added 該行已添加到 DataRowCollection 中,AcceptChanges 尚未調用。
Deleted 該行已通過 DataRowDelete 方法被刪除。 
Detached 該行已被創建,但不屬於任何 DataRowCollectionDataRow 在以下情況下立即處於此狀態:創建之后添加到集合中之前;或從集合中移除之后。 
Modified 該行已被修改,AcceptChanges 尚未調用。 
Unchanged 該行自上次調用 AcceptChanges 以來尚未更改。 

一個DataRow對象剛被創建之后其狀態是Detached,是孤立的一個存在,所以建立了DataRow之后在通過DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable,這時,DataRow的狀態由Detached轉變為Added。

當修改了這個DataRow后,這個DataRow的狀態轉變為Modified,當用DataRow.Delete()方法刪除DataRow后,DataRow狀態將轉變為Deleted,不過此行還存在在DataTable中,只是狀態改變了,這時用DataTable.Rows.Count查看行數,跟刪除前是一樣的。

在使用Delete方法后,RowState變成“Deleted”。在您調用AcceptChanges之前,它一直保持“已刪除”,這時不能再修改該行,否則會報錯:不能通過已刪除的行訪問該行的信息。可以使用RejectChanges取消刪除行。

Deleted狀態下,如果還想重新使用該行,可以在調用AcceptChanges后,重新使用DataTable.Rows.Add(DataRow)方法加入,這時行的狀態轉變為Added。

注意:

1、只有在Added狀態下使用Delete(),該行才能在DataTable中刪除,使Rows.Count-1,DataRow的狀態變為Detached(游離狀態,使用NewRow()實例化行,還沒加入到DataTable中也是這種狀態)。如果在Added狀態下使用DataTable.AcceptChanges()方法之后,在使用DataRow.Delete()方法,該行不會從DataTable中刪除,只是把狀態變為Deleted,行數不變。

2、Unchange(非Deleted行在調用AcceptChanges后的狀態,直接從數據庫中取的也是這種狀態),在修改內容或調用Delete()后,變為Modify或者Deleted狀態

3、Added在修改后還是Added

4、Unchange和Modify狀態下調用Delete()會轉變以Deleted,但Rows.Count並不減少

5、Deleted狀態下如果修改該行內容會報: 不能通過已刪除的行訪問該行的信息 錯誤

6、Deleted狀態下,如果還想重新使用該行,可以在調用AcceptChanges 后,重新使用 Table.Rows.Add(DataRow)方法加入,加入后的狀態為Added。

示例代碼:

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 
 8 namespace ConsoleApplication1
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //創建一個DataTable
15             DataTable dtDemo = GetDataTable();
16             DataRow myDr;
17 
18             //Detached row:該行已經被創建,但不屬於任何DataRowCollection
19             myDr = dtDemo.NewRow();
20             Console.WriteLine("New Row狀態:"+myDr.RowState);
21             //將新創建的行添加到DataTable中
22             dtDemo.Rows.Add(myDr);
23             Console.WriteLine("Add Row狀態:"+myDr.RowState);
24             
25             #region Add之后直接使用Delete,RowState變為Detached,  行數-1
26             //myDr.Delete();
27             //Console.WriteLine("myDr的狀態:" + myDr.RowState);
28             //Console.WriteLine("dtDemo的行數:" + dtDemo.Rows.Count.ToString()); 
29             #endregion
30             
31             dtDemo.AcceptChanges();
32             Console.WriteLine("AcceptChanges狀態:" + myDr.RowState);
33             //修改
34             myDr["Name"] = "Tom";
35             Console.WriteLine("Modified狀態:" + myDr.RowState);
36             Console.WriteLine("刪除前的行數:" + dtDemo.Rows.Count.ToString());
37 
38             #region 非Added狀態下使用Delete,RowState變為Deleted,  行數不變
39             myDr.Delete();
40             Console.WriteLine("Deleted狀態:" + myDr.RowState);
41             Console.WriteLine("刪除后的行數:" + dtDemo.Rows.Count.ToString()); 
42             #endregion
43 
44             //這時myDr的狀態變為Detached
45             Console.WriteLine("myDr的狀態:" + myDr.RowState);
46             //重新加入myDr,這時狀態變為Added
47             dtDemo.Rows.Add(myDr);
48             Console.WriteLine("myDr的狀態:" + myDr.RowState);
49             //取消刪除行
50             //dtDemo.RejectChanges();
51             Console.ReadKey();
52         }
53 
54         /// <summary>
55         /// 創建一個空的DataTable
56         /// </summary>
57         /// <returns></returns>
58         static DataTable GetDataTable()
59         {
60             DataTable dt = new DataTable("MyTable");
61             DataColumn dc = new DataColumn("Name", typeof(string));
62             dt.Columns.Add(dc);
63             return dt;
64         }
65     }
66 }

 


免責聲明!

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



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