Вопрос ADO.net - Как я могу обновить столбец в строке DataTable с помощью RowChanged, не вызывая бесконечный цикл? - PullRequest
0 голосов
/ 19 января 2010

Как я могу обновить значение столбца (программно) в строке DataTable с помощью события RowChanged, не вызывая бесконечный цикл? (который я сейчас получаю)

Примечание. Я не хочу использовать свойство 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;

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Вы можете отказаться от подписки в обработчике событий, хотя это сделает ваш код не поточно-ориентированным.

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);
}
0 голосов
/ 12 апреля 2013

Попробуйте с этим

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

И

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