【发布时间】:2010-12-23 04:25:14
【问题描述】:
我有一个令人讨厌的异常,似乎发生在 DataGridView 代码的深处。
我有一个继承自 BindingList 的类,它是 BindingSource 的 DataSource,它是 DataGridView 的 DataSoure。
在某些奇怪的情况下,我在类的重写 OnListChanged() 方法期间遇到异常:
protected override void OnListChanged(ListChangedEventArgs e)
{
base.OnListChanged(e); // <-- ArgumentOutOfRangeException
// ...Parametername: rowIndex
}
堆栈跟踪如下所示:
bei System.Windows.Forms.DataGridView.GetCellDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow)
bei System.Windows.Forms.DataGridView.GetCellAdjustedDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow)
bei System.Windows.Forms.DataGridView.InvalidateCellPrivate(Int32 columnIndex, Int32 rowIndex)
bei System.Windows.Forms.DataGridView.OnCellCommonChange(Int32 columnIndex, Int32 rowIndex)
bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(ListChangedEventArgs e)
bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender, ListChangedEventArgs e)
bei System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)
bei System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e)
bei System.Windows.Forms.BindingSource.OnListChanged(ListChangedEventArgs e)
bei System.Windows.Forms.BindingSource.InnerList_ListChanged(Object sender, ListChangedEventArgs e)
bei System.ComponentModel.ListChangedEventHandler.Invoke(Object sender, ListChangedEventArgs e)
bei System.ComponentModel.BindingList`1.OnListChanged(ListChangedEventArgs e)
bei My.Own.BindingList.OnListChanged(ListChangedEventArgs e)
好吧,我可以添加一个 try\catch 异常,但我很好奇为什么会发生这种情况。
曾经有人告诉我,我可以使用反射和 System.Diagnostics.StackTrace 的强大功能来获取导致异常的 StackFrame (到目前为止有效)并检查对我有帮助的参数(我不知道该怎么做),因为如果我知道 rowindex / columnindex 的值,我可以追踪异常。
如果可能的话,谁能告诉我从异常中获取参数?
提前致谢!
更新:
该问题似乎与某些线程问题有关,与 rowIndex 无关。 BindingList 是 DataGridView 的数据源。如果我将一个元素添加到列表中,则会触发 OnListChanged 事件,这会导致 dataGridView 从 T 的新实例加载数据绑定属性。 在一个属性的 getter 中,我有一些代码更改了另一个属性,导致 T 实例的 OnPropertyChanged 事件被触发。
BindingList Add 方法中只有一个简单的锁(this),如下所示: Has anyone written a thread-safe BindingList<T>? 为我解决了这个问题。难以调试;(
【问题讨论】:
-
是的,线程问题很难调试。很高兴你找到它!
标签: c# .net exception datagridview stack-trace