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简 ...
随机推荐
- 微信小程序四(设置底部导航)
好了 小程序的头部标题 设置好了,我们来说说底部导航栏是如何实现的. 我们先来看个效果图 这里,我们添加了三个导航图标,因为我们有三个页面,微信小程序最多能加5个. 那他们是怎么出现怎么着色的呢?两步 ...
- Python学习笔记——MySQL的基本操作(2)
1 运算符操作(配合查.修.删操作) 数据库的语法结构 查:select * from 表名 where 字段名 运算符 数字/字符; 改:update 表名 set 字段名=值,... wher ...
- python os库学习笔记
os.getcwd(): 获取当前目录 os.name: 获取当前使用的操作系统 eg: print os.name os.remove(): 删除指定文件 eg: os.remove('test.t ...
- nginx实战四
nginx负载均衡 Nginx通过upstream和proxy_pass实现了负载均衡.本质上也是Nginx的反向代理功能,只不过后端的server为多个. 1.简单的轮询 upstream www ...
- Ubuntu下设置环境变量
Ubuntu下设置环境变量有三种方法,一种用于当前终端,一种用于当前用户,一种用于所有用户: 一:用于当前终端: 在当前终端中输入:export PATH=$PATH:<你的要加入的路径&g ...
- java与数据库交互常用到的一些方法
下面我整理了一下java中常用的几个与数据库交互的常用方法,仅供参考: 1.执行SQL(dao层的实现类中) (1)SQL查询: //import org.hibernate.Query;//impo ...
- django 在建模时的一个手贱
最近在写一个网站,在建立model的时候遇到了一些问题,最后找了好久才找到为什么. 一.django的model定义如下: from django.db import models # Create ...
- unity 在脚本B中调用脚本A的函数
一,在脚本B中调用脚本A的函数. 脚本A: //myFuncs.cs using UnityEngine;using System.Collections; namespace myFuncs{ ...
- Hadoop启动过程分析
先把客户端修好,后续慢慢写. 菊子曰:体验离线写博的乐趣
- [na]诺顿ghost磁盘对刻(备份系统分区或数据分区)
一 诺顿ghost简介 ,可以克隆分区 也可以克隆磁盘 ,克隆成img或磁盘内容对刻 ,磁盘分区--img---磁盘分区 磁盘---磁盘 二 操作步骤 对刻好的系统 整体思路: ,A是模板机,A有C ...