如何通过使用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)对我来说是有意义的(即在它保存之前更改值可以这么说)但是当我尝试这个时,我得到一个“无法更改RowChanging事件中的建议值”在下一行在处理程序中:
e.Row["OverallSize"] = e.Row["OverallSize"] ?? 0;
答案 0 :(得分: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);
}
答案 1 :(得分:0)
试试这个
e.Row.Table.RowChanged -= new DataRowChangeEventHandler(DT_Row_Changed);
和
e.Row.Table.RowChanged += new DataRowChangeEventHandler(DT_Row_Changed);