C#获取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;
        }
    }
}

到此这篇关于C#获取DataTable对象状态DataRowState的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#去除DataTable重复数据的三种方法

    业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库. 其中要避免目标库插入重复数据.这重复数据可能是源数据库本身就有重复数据,还有就是已经插入避免重复插入. 过滤自身重复数据解决方案 第一种:采用DataView.ToTable()方法 DataView.ToTable 方法 .NET Framework 2.0 其根据现有 DataView中的行,创建并返回

  • C# DataTable常见用法汇总

    C# DataTable 的常见用法: (1)新建数据表. DataTable dt=new DataTable();如果带个String参数,此参数表示表名. (2)向表添加列. //数据库的Nvarchar等类型,在此可用String兼容.可不指明数据类型 DataColumn dc = new DataColumn("商品编号", typeof(system.string)); dt.Columns.Add(dc); (3)设置表特定行与列的数据值. dt.Rows[i].Set

  • C# DataTable数据遍历优化详解

    我们在进行开发时,会经常使用DataTable来存储和操作数据,我发现在遍历DataTable并对数据进行删除和添加操作时速度非常慢,查阅相关资料并测试在添加主键后可以使遍历和操作速度提高很多: 测试代码,测试的是我们向取出来数据满足Flag!=1条件的所有数据的后面添加一条数据(因为这条数据的一些字段值是根据前面的几条满足条件["AccID='" + accID + "' AND Y='" + year + "' AND AbsID <= &quo

  • C# DataTable分页处理实例代码

    有时候我们从数据库获取的数据量太大,而我们不需要一次性显示那么多的时候,我们就要对数据进行分页处理了,让每页显示不同的数据. public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)//PageIndex表示第几页,PageSize表示每页的记录数 { if (PageIndex == 0) return dt;//0页代表每页数据,直接返回 DataTable newdt = dt.Copy(); new

  • C#使用Datatable导出Excel

    本文实例为大家分享了C#使用Datatable导出Excel的具体代码,供大家参考,具体内容如下 using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using Newtonsoft.Json; namespace EasyFrame.Com

  • C#中的DataTable查询实战教程

    DataTable查询 工作中遇到了需要进行DataTable进行查询的需求,简单研究了一下,最终使用一下方案实现,简单记录一下便于以后使用. DataTable dt = dataBox.GetDataForDataTable();//获取DataTable所有数据,准备进行查询 DataRow[] dtRow = dt.Select("调剂日期='"+MediumCode.Text.Trim()+"'");//根据查询条件,筛选出所有满足条件的列 DataTab

  • C# DataTable与Model互转的示例代码

    /// <summary> /// 实体转换辅助类 /// </summary> public class ModelConvertHelper<T> where T : new() { /// <summary> /// List泛型转换DataTable. /// </summary> public DataTable ListToDataTable<T>(List<T> items) { var tb = new D

  • C#中DataTable 转实体实例详解

    因为Linq的查询功能很强大,所以从数据库中拿到的数据为了处理方便,我都会转换成实体集合List<T>. 开始用的是硬编码的方式,好理解,但通用性极低,下面是控件台中的代码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo1 { class Pr

  • C#中DataTable的创建与遍历实现

    1.创建DataTable对象 /// <summary> /// 创建DataTable对象 /// </summary> public static DataTable CreateDataTable() { //创建DataTable DataTable dt = new DataTable("NewDt"); //创建自增长的ID列 DataColumn dc = dt.Columns.Add("ID", Type.GetType(&

  • C# 遍历datatable字段名和value的案例

    遍历datatable的方法: DataTable dt = dataSet.Tables[0]; foreach (DataColumn col in dt .Columns) { string name=col.ColumnName;//获取到DataColumn列对象的列名 dt.columns[行数][col.ColumnName].tostring() } foreach (System.Data.DataColumn k in dataTable.Columns) { columnN

  • C# Datatable的几种用法小结

    在C#中,从数据库中读取出来的数据一般都会存储在datatable中.datatable其实也是一张表,就像是从数据库中将检索出来的结果copy到datatable中一样.datatable的内部数据结构就是这样的 一个二维表. 下面介绍一下datatable中的几种用法. 添加引用 //引用命名空间 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"new-tabel"的空表: DataT

随机推荐