Фон
У меня есть элемент управления DataGridView
, который я использую, и я добавил свой обработчик ниже к событию DataGridView.CellFormatting
, чтобы значения в некоторых ячейках можно было сделать более понятными для человека. Этот обработчик событий работал отлично, форматируя все значения без проблем.
Однако недавно я обнаружил, что очень редкое обстоятельство вызывает необычную ошибку. Столбец в моем DataGridView
для даты выполнения элемента всегда имеет значение int
. 0
указывает, что событие никогда не наступает, любое другое значение является отметкой времени UTC для даты исполнения. Соответствующий столбец базы данных MySQL не допускает нулевые значения. Когда пользователь переместился из одной строки DataGridView
с датой исполнения, в другую строку DataGridView
с датой исполнения (в этот момент все по-прежнему выглядит нормально), а затем нажимает кнопку, которая перезагружает данные из базы данных без отправки обновлений, по сути вызова DataAdapter.Fill()
), программа генерирует StackOverflowException
**.
Нет рекурсии?
Что для меня так необычно, так это то, что я не вижу, где находится рекурсия или бесконечный цикл. Я добавил int cellFormatCallCount
в качестве члена класса и увеличивал его во время каждого вызова, но в момент выдачи исключения отладчик показывает значение этого int
как 1, что я ожидаю, так как не находился под происходило впечатление и рекурсия.
Может кто-нибудь мне помочь?
Как посмотреть трассировку стека? В VS2008 это говорит:
{Cannot evaluate expression because the current thread is in a stack overflow state.}
С уважением,
Robinson
private int cellFormatCallCount = 0;
private void myDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
try {
// to format the cell, we will need to know its value and which column its in
string value = "";
string column = "";
// the event is sometimes called where the value property is null
if (e.Value != null) {
cellFormatCallCount++; // here is my test for recursion, this class member will increment each call
// This is the line that throws the StackOverflowException
/* ********************* */
value = e.Value.ToString();
/* ********************* */
column = actionsDataGridView.Columns[e.ColumnIndex].Name;
} else {
return; // null values cannont be formatted, so return
}
if (column == "id") {
// different code for formatting each column
} else if (column == "title") {
// ...
} else {
// ...
}
} finally {
cellFormatCallCount = 0; // after we are done with the formatting, reset our recursion counter
}
}