0

無限ループをトリガーせずに、RowChanged イベントを使用して DataTable の行の列の値を (プログラムで) 更新するにはどうすればよいですか? (私は現在取得しています)

DataColumn.Expression プロパティを使用したくないことに注意してください。

たとえば、次の例では、再帰ループとスタック オーバーフロー エラーが発生します。

    DataColumn dc = new DataColumn("OverallSize", typeof(long));
    DT_Webfiles.Columns.Add(dc);
    DT_Webfiles.RowChanged += new DataRowChangeEventHandler(DT_Row_Changed);

private static void DT_Row_Changed(object sender, DataRowChangeEventArgs e)
{
    Console.Out.WriteLine("DT_Row_Changed - Size = " + e.Row["OverallSize"]);
    e.Row["OverallSize"] = e.Row["OverallSize"] ?? 0;
    e.Row["OverallSize"] = (long)e.Row["OverallSize"] + 1;
}

ありがとう

PS。実際、RowChanging イベント (RowChanged ではなく) を使用することは理にかなっています (つまり、いわば保存する前に値を変更します)。ハンドラーで:

e.Row["OverallSize"] = e.Row["OverallSize"] ?? 0;
4

2 に答える 2

2

イベント ハンドラー内でサブスクライブを解除できますが、コードがスレッド セーフではなくなります。

DataColumn dc = new DataColumn("OverallSize", typeof(long));
DT_Webfiles.Columns.Add(dc);
DT_Webfiles.RowChanged += new DataRowChangeEventHandler(DT_Row_Changed);

private static void DT_Row_Changed(object sender, DataRowChangeEventArgs e)
{
    e.RowChanged -= new DataRowChangeEventHandler(DT_Row_Changed);
    Console.Out.WriteLine("DT_Row_Changed - Size = " + e.Row["OverallSize"]);
    e.Row["OverallSize"] = e.Row["OverallSize"] ?? 0;
    e.Row["OverallSize"] = (long)e.Row["OverallSize"] + 1;
    e.RowChanged += new DataRowChangeEventHandler(DT_Row_Changed);
}
于 2010-01-19T01:43:47.630 に答える