【问题标题】:ADO.net Question - How can I update a column in a Row of a DataTable with RowChanged without triggering infinite loop?ADO.net 问题 - 如何在不触发无限循环的情况下使用 RowChanged 更新 DataTable 的行中的列?
【发布时间】:2010-01-19 01:38:54
【问题描述】:

如何通过使用 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;

【问题讨论】:

  • 为什么每次更新行时都需要增加Row["OverallSize"]
  • 这只是我进行更改的简单方法 - 后来我将使用我需要执行的计算来更改它。

标签: ado.net datatable datacolumn


【解决方案1】:

您可以在事件处理程序中取消订阅,但这会使您的代码不是线程安全的。

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);
}

【讨论】:

  • 谢谢丹 - 你认为我应该考虑一种完全不同的方法来研究最佳实践吗? (并使线程安全)
【解决方案2】:

试试这个

 e.Row.Table.RowChanged -= new DataRowChangeEventHandler(DT_Row_Changed);

 e.Row.Table.RowChanged += new DataRowChangeEventHandler(DT_Row_Changed);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2014-02-23
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多