DataTable使用技巧:DataRowState
DataGridView:获取 DataRow 对象的状态,共有5个枚举值。
| Added | 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。 |
| Deleted | 该行已通过 DataRow 的 Delete 方法被删除。 |
| Detached | 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。 |
| 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。
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//创建一个DataTable
DataTable dtDemo = GetDataTable();
DataRow myDr; //Detached row:该行已经被创建,但不属于任何DataRowCollection
myDr = dtDemo.NewRow();
Console.WriteLine("New Row状态:"+myDr.RowState);
//将新创建的行添加到DataTable中
dtDemo.Rows.Add(myDr);
Console.WriteLine("Add Row状态:"+myDr.RowState); #region Add之后直接使用Delete,RowState变为Detached, 行数-1
//myDr.Delete();
//Console.WriteLine("myDr的状态:" + myDr.RowState);
//Console.WriteLine("dtDemo的行数:" + dtDemo.Rows.Count.ToString());
#endregion dtDemo.AcceptChanges();
Console.WriteLine("AcceptChanges状态:" + myDr.RowState);
//修改
myDr["Name"] = "Tom";
Console.WriteLine("Modified状态:" + myDr.RowState);
Console.WriteLine("删除前的行数:" + dtDemo.Rows.Count.ToString()); #region 非Added状态下使用Delete,RowState变为Deleted, 行数不变
myDr.Delete();
Console.WriteLine("Deleted状态:" + myDr.RowState);
Console.WriteLine("删除后的行数:" + dtDemo.Rows.Count.ToString());
#endregion //这时myDr的状态变为Detached
Console.WriteLine("myDr的状态:" + myDr.RowState);
//重新加入myDr,这时状态变为Added
dtDemo.Rows.Add(myDr);
Console.WriteLine("myDr的状态:" + myDr.RowState);
//取消删除行
//dtDemo.RejectChanges();
Console.ReadKey();
} /// <summary>
/// 创建一个空的DataTable
/// </summary>
/// <returns></returns>
static DataTable GetDataTable()
{
DataTable dt = new DataTable("MyTable");
DataColumn dc = new DataColumn("Name", typeof(string));
dt.Columns.Add(dc);
return dt;
}
}
}
DataTable使用技巧:DataRowState的更多相关文章
- DataTable使用技巧总结【转】
一.DataTable简介 ()构造函数 DataTable() 不带参数初始化DataTable 类的新实例. DataTable(string tableName) 用指定的表名初始化DataTa ...
- C#中DataTable使用技巧
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- (转载)DataTable使用技巧总结
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.Da ...
- ToolStripComboBox的DataSource和DataTable使用技巧
可以使用Items属性private void GetData() //一下数据均为测试{toolStripComboBox1.Items.Clear(); DataTabl ...
- C# DataTable的詳細用法
转载别人的转载,原作者都不知道了 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一 ...
- C# DataTable的详细用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- C# DataTable的詳細使用方法
在项目中经经常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTabl ...
- C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN
C# DataTable的詳細用法 - hcw_peter的专栏 - 博客频道 - CSDN.NET 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够 ...
- DataTable用法
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
随机推荐
- 总结PLSQL的快捷键以及使用技巧
http://www.dedecms.com/knowledge/data-base/oracle/2012/0724/3643.html 最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他 ...
- POJ 2965 The Pilots Brothers' refrigerator (DFS)
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15136 ...
- Sourcetree 更新git账号密码
删除Sourcetree 缓存文件(只需要删密码文件),文件位置: Mac: ~/Library/Application Support/SourceTree Windows: C:\Users\US ...
- CLH队列锁
http://blog.csdn.net/aesop_wubo/article/details/7533186 CLH锁即Craig, Landin, and Hagersten (CLH) lock ...
- Python exp() 函数
描述 exp() 方法返回x的指数,ex. 语法 以下是 exp() 方法的语法: import math math.exp( x ) 注意:exp()是不能直接访问的,需要导入 math 模块,通过 ...
- vim打造开发IDE
个人的插件和配置 set nocompatible " 去除VI一致性,必须要添加 filetype off " 必须要添加 " advanced keys " ...
- JSP页面中文乱码
近期搭建了一个JAVA WEB项目,引入了国际化的ResourceBundle. 顺便赞一个,Eclipse Mars,自带了中文转unicode编码的功能. ① 根据语言选择,初始化Resource ...
- Matlab图形调色
Matlab图形调色 Simple example var colormap = require('colormap') options = { colormap: 'jet', // pic ...
- html中如何让table显示的更好
在html文件编写中,经常使用到table来做一些表格.如何让它显示的更像一张表格?接下来为你讲解. 基本格式 <div> <th>我的一张表格</th> < ...
- 怎么从docker中copy文件到 本机
怎么从docker中copy文件到 本机 docker cp <containerId>:/file/path/within/container /host/path/target