首页 新闻 会员 周边 捐助

如何执行单个DataRow对象的AcceptChanges And RejectChanges方法?

0
悬赏园豆:20 [已解决问题] 解决于 2010-04-05 00:21

using System;
using System.Data;
using System.Data.SqlClient;

public class Test
{
static void Main()
{
//Create a Table for two columns.
DataTable tbl = CreateTable();

//Added ten rows
AddData(tbl);

DisplayTableInfo(tbl, "AcceptChanges之前的行状态");
tbl.AcceptChanges();
DisplayTableInfo(tbl, "AcceptChanges之后的行状态");
ModifyData(tbl);

DataRow row = tbl.Rows[3];
Console.WriteLine(row.RowState);
row.RejectChanges();
row["item"] = "Deleted , Unchanged , Edited";
row.AcceptChanges();

//问题一:(1)
//我想通过检测每个DataRow对象的行状态,如果是DataRowState.Deleted则进行AcceptChanges.
//foreach(DataRow r in tbl.Rows)
// if(r.RowState == DataRowState.Deleted)
// r.AcceptChanges();
//当然以上方式将导致System.InvalidOperationException.

//曾经使用过的方法(2) 这样可以完成以上的执行结果吗?
//DataTable temp = tbl.GetChanges(DataRowState.Deleted);

//当然可以使用tbl.AcceptChanges方法进行调用.但是我只想把那些DataRowState的枚举值为Deleted的
//行进行AcceptChanges.


DisplayTableInfo(tbl, "再次调用AcceptChanges之后的行状态");
}

public static DataTable CreateTable()
{
DataTable tbl = new DataTable("MyTable");
DataColumn col;

col = tbl.Columns.Add("id", Type.GetType("System.Int32"));
col.AutoIncrement = true;

col = tbl.Columns.Add("item", Type.GetType("System.String"));
col.AllowDBNull = false;
tbl.PrimaryKey = new DataColumn[] { tbl.Columns["id"] };
return tbl;
}

public static void AddData(DataTable tbl)
{
for (int i = 0; i < 10; i++)
{
DataRow row = tbl.NewRow();
row["item"] = "item " + i.ToString();
tbl.Rows.Add(row);
}
}

public static void ModifyData(DataTable tbl)
{
DataRowCollection itemCollection = tbl.Rows;
itemCollection[0].Delete();
itemCollection[2].Delete();
itemCollection[3].Delete();
itemCollection[5].Delete();
}

public static void DisplayTableInfo(DataTable tbl, string msg)
{
Console.WriteLine(tbl.TableName+" 中所有的数据:");
foreach (DataRow row in tbl.Rows)
{
foreach (DataColumn col in row.Table.Columns)
Console.Write(row[col] + " , ");
Console.WriteLine();
}

DisplayRowState(tbl, msg);
}

public static void DisplayRowState(DataTable tbl, string msg)
{
Console.WriteLine(msg);
foreach (DataRow row in tbl.Rows)
Console.WriteLine(row.RowState);
Console.WriteLine();
}
}


//如果您对于DataTable,DataRow比较熟习,请把相关的代码附上.
//不胜感激.
//我将在线等待...

问题补充: @所有好心人: 请问我怎样给别人留言,请大家帮助我! 谢谢了...
shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-03-22 19:45
< >
分享
最佳答案
0

由于tbl.Rows集合已经经过修改,不能使用foreach进行遍历,因此只需使用for对方法(1)进行改造即可:

for (int i = 0; i < tbl.Rows.Count; i++)
if (tbl.Rows[i].RowState == DataRowState.Deleted)
tbl.Rows[i].AcceptChanges();

 

 

收获园豆:20
麒麟.NET | 老鸟四级 |园豆:3614 | 2010-03-22 23:31
@麒麟.NET: 您好,又一次看到您对我的帮助.十分感谢! 除了您提到的使用for循环通过调用tbl.Rows.Count属性获取总行数方法外,有没有更加智能化的方式进行获取的方法呢?比如说我只想获取在tbl对象中行状态被改变的数据行. 通过这些被改变的数据行再进行筛选,不知是否可以达到这样的效果.
shuzhiguolu | 园豆:32 (初学一级) | 2010-03-24 09:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册