背景
我有一个DataGridView
正在使用的控件,我在下面添加了我的处理程序到DataGridView.CellFormatting
事件中,以便可以使某些单元格中的值更易于阅读。这个事件处理程序一直工作得很好,格式化所有值都没有问题。
然而,最近,我发现一个非常罕见的情况会导致一个不寻常的错误。我DataGridView
的项目到期日的列总是有一个int
值。0
表示事件永远不会到期,任何其他值都是到期日的 UTC 时间戳。对应的 MySQL db 列不允许空值。当用户从DataGridView
具有截止日期的一行移动到具有截止日期的另一DataGridView
行时(此时一切仍然正常),然后按下一个按钮,从数据库中重新加载数据(不发送更新,本质上是调用DataAdapter.Fill()
),程序生成一个StackOverflowException
**。
没有递归?
对我来说如此不寻常的是,我看不到递归或无限循环在哪里。我添加int cellFormatCallCount
为类成员,并在每次调用期间递增它,但在引发异常时,调试器将其值显示int
为 1,这是我所期望的,因为我没有受到印象并且递归正在发生。
有人可以帮助我吗?
如何查看堆栈跟踪?在 VS2008 中它说:
{Cannot evaluate expression because the current thread is in a stack overflow state.}
最好的祝福,
罗宾逊
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
}
}