gpt4 book ai didi

c# - 从 DataTable 访问已删除的行

转载 作者:太空狗 更新时间:2023-10-29 19:53:22 61 4
gpt4 key购买 nike

我有一个父 WinForm,它有一个 MyDataTable _dt 作为成员。 MyDataTable 类型是在 Visual Studio 2005 的“类型化数据集”设计器工具中创建的(MyDataTable 继承自 DataTable)_dt 通过 ADO.NET 从数据库中填充。基于表单中用户交互的变化,我从表中删除一行,如下所示:

_dt.FindBySomeKey(_someKey).Delete();

稍后,_dt 按值传递给对话框表单。从那里,我需要扫描所有行以构建一个字符串:

           foreach (myDataTableRow row in _dt)
{
sbFilter.Append("'" + row.info + "',");
}

问题是在删除后执行此操作时,会抛出以下异常:DeletedRowInaccessibleException: 删除行信息无法通过行访问。

我目前正在使用的解决方法(感觉像是 hack)如下:

           foreach (myDataTableRow  row in _dt)
{
if (row.RowState != DataRowState.Deleted &&
row.RowState != DataRowState.Detached)
{
sbFilter.Append("'" + row.info + "',");
}
}

我的问题:这是执行此操作的正确方法吗?为什么 foreach 循环会访问已通过 Delete() 方法标记的行??

最佳答案

Delete method标记要删除的行;在您调用 AcceptChanges 之前,该行实际上并未被删除.

相反,请调用 _dt.Rows.Remove(_dt.FindBySomeKey(_someKey)) ,它也将接受更改。
信不信由你, Rows.Remove will completely remove the row, whereas row.Delete() won't . 请注意,如果您调用 Rows.Remove ,该行将永久消失,并且不会被 DataAdapter 从数据库中删除。

在 C# 3 中,您可以替换 if具有以下扩展方法的语句:

///<summary>Gets the rows in a typed DataTable that have not been deleted.</summary>
public static EnumerableRowCollection<TRow> CurrentRows<TRow>(this TypedTableBase<TRow> table) where TRow : DataRow {
return table.Where(r => r.RowState != DataRowState.Deleted);
}

foreach (myDataTableRow row in _dt.CurrentRows())
{
...

编辑

这是一个 C# 2 版本:

static class Utils {
public static IEnumerable<TRow> CurrentRows(IEnumerable<TRow> table) where TRow : DataRow {
foreach(TRow row in table) {
if (row.RowState != DataRowState.Deleted)
yield return row;
}
}
}


foreach (myDataTableRow row in Utils.CurrentRows(_dt))
{

您也可以将此函数放在类型表的分部类中:

partial class MyTable {
public IEnumerable<MyRow> CurrentRows() { return Utils.CurrentRows(this); }
}

关于c# - 从 DataTable 访问已删除的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2714171/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com