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简 ...
随机推荐
- 为同一部电脑设置2个IP地址
为同一部电脑设置2个IP地址 在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans下 点击0000.0001,000 ...
- LINUX创建本地yum源
.创建一个文件夹,把光盘中所有的RPM安装包都拷贝进来 # mkdir /rpms_yum .把光盘上的RPM包全部复制到rpms_yum中 # cd /mnt/cdrom/Packages/ # c ...
- webDAV服务的开启以及客户端的上传、下载、删除、新建文件夾、列表的代码(C#)
windows server 2003开启webDAV服务 1. 启动“IIS管理器”选择“WEB服务扩展”,选择“WEBDAV”的允许按钮启动WEBDAV功能 2.建立一个虚拟目录,对应到一个本地目 ...
- centos部署supervisor
#!/bin/bash yum -y install python-setuptools ping pypi.python.org -c 4 >/dev/null 2>&1 eas ...
- 编码规范:Eclipse Checkstyle配置
http://chenzhou123520.iteye.com/blog/1627618 http://www.cnblogs.com/lanxuezaipiao/p/3202169.html
- jquery autoComplete 插件
github: https://github.com/Pixabay/jQuery-autoComplete/blob/master/demo.html 官网demo https://goodies. ...
- introduction to anaconda
一.安装好anaconda后进行更新 说明:在windows环境中的操作,在linux环境中请参考具体书籍. 1.进入cmd命令行 执行 conda update conda conda update ...
- JavaScript与DOM(上)
本来像自己写一篇的...结果看到了Tom uncle的这篇..总结的确实很赞,其他文章也非常好推荐 转载自:http://www.cnblogs.com/TomXu/archive/2011/12/1 ...
- Android开发10——Activity的跳转与传值
Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据. 一.Activity跳转 方法一Intent intent = new Intent(A.this, B ...
- webservice快速入门-使用wsimport生成ws服务端(二)
上个例子演示的是在当前项目下发布的Webservice Server,而实际应用中和Client是分离的,本文介绍两种客户端开发方式: 1.导出WebService服务端服务接口到jar包,客户端引入 ...