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简 ...
随机推荐
- Eclipse 选中变量高亮显示设置
- 利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程序中,有个HTTP请求数据头中,包含一个BASE64编码的字符串,例如: eJyVjMENgDAMA1fp ...
- 【Linux】在线求助man page与info page
先来了解一下Linux有多少命令呢?在文本模式下,你可以直接按下两个[Tab]按键,看看总共有多少命令可以让你用? [knife@www ~]$ <==在这里不要输入任何字符,直接输入两次[ta ...
- 为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
- Python 字典 keys() 方法
描述 Python 字典 keys() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有的键. 语法 keys() 方法语法: D.keys() 参数 无. 返回值 ...
- vim打造开发IDE
个人的插件和配置 set nocompatible " 去除VI一致性,必须要添加 filetype off " 必须要添加 " advanced keys " ...
- /usr/local/ssl/lib/libssl.a: error adding symbols: Bad value
一.背景 编译第三方库A的时候提示依赖openssl库. 二.编译openssl库 去官网下载最新版本的openssl-1.0.2l.tar.gztar -zxvf openssl-1.0.2l.ta ...
- linux中计划任务执行脚本
我使用的是ubuntu14.4,所以在ubuntu中一切正常,在其他linux系统中应该都差不多. 1 计划任务,crontab命令选项: -u指定一个用户, -l列出某个用户的任务计 ...
- Centos7 防火墙关闭和启用iptables防火墙
操作系统环境:CentOS Linux release 7.0.1406(Core) 64位CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭f ...
- NGUI下拉菜单学习UIPopupList
NGUI下拉栏主要注意2点 1.弹出文字收回去,需要更新主显文字信息,要绑定调用 2.有时候发现弹出来的面板差别很大 看了下代码 会根据父节点取相对位置. 这样位置就可以了,很奇怪的做法..