3

を使用DataTable.GetChanges()すると、変更されたすべての行のリストが表示されます。行レベルで同じことを行う組み込みの方法はありますか? ItemArrayループ内で手動で比較する以外に、変更された列を確認するには?

4

1 に答える 1

13

いいえ。

このコードを使用して、値を以前のバージョンと比較できます。

public static class DataRowExtensions
{
    private static bool hasCellChanged(DataRow row, DataColumn col)
    {
        if (!row.HasVersion(DataRowVersion.Original))
        {
            // Row has been added. All columns have changed. 
            return true;
        }
        if (!row.HasVersion(DataRowVersion.Current))
        {
            // Row has been removed. No columns have changed.
            return false;
        }
        var originalVersion = row[col, DataRowVersion.Original];
        var currentVersion = row[col, DataRowVersion.Current];
        if (originalVersion == DBNull.Value && currentVersion == DBNull.Value)  
        {
            return false;
        }
        else if (originalVersion != DBNull.Value && currentVersion != DBNull.Value)  
        {  
            return !originalVersion.Equals(currentVersion);
        }
        return true;
    }

    public static IEnumerable<DataColumn> GetChangedColumns(this DataRow row)
    {
        return row.Table.Columns.Cast<DataColumn>()
            .Where(col => hasCellChanged(row, col));
    }

    public static IEnumerable<DataColumn> GetChangedColumns(this IEnumerable<DataRow> rows)
    {
        return rows.SelectMany(row => row.GetChangedColumns())
            .Distinct();
    }

    public static IEnumerable<DataColumn> GetChangedColumns(this DataTable table)
    {
        return table.GetChanges().Rows
            .Cast<DataRow>()
            .GetChangedColumns();
    }
}

datatableまたは datarow でどの列が変更されたかを確認します

例:

DataTable table;
table.GetChangedColumns()

List<DataRow> listOfRows;
listOfRows.GetChangedColumns()

DataRow row;
row.GetChangedColumns()
于 2013-06-16T14:00:15.653 に答える