我有一个令人讨厌的异常,似乎在DataGridView代码中深处发生。
我有一个继承自BindingList的类,它是BindingSource的DataSource,它是DataGridView的DataSoure。
在某些奇怪的情况下,我在我的类的重写的OnListChanged()方法中遇到异常:
protected override void OnListChanged(ListChangedEventArgs e)
{
base.OnListChanged(e); // <-- ArgumentOutOfRangeException
// ...Parametername: rowIndex
}
stacktrace看起来像这样:
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>? 为我解决了这个问题。难以调试;(
答案 0 :(得分:2)
此数据可在调试版本中使用,而不是在发行版本中。要获取该数据,您可以与visual studio的调试器进行交互。你可以通过编程方式完成。但是,我认为调用Debugger.Break()
更容易(并且可能先检查是否先附加调试器),然后进行分析。
与IDE和调试器进行交互here's an answer that explains how(它解释了如何以编程方式设置断点,但通过与IDE交互来实现)。
要查找您所追踪的信息,您可以使用在IDE编写宏时可用的自动化方法。如果你能够反映你在堆上的对象的方式会更容易,并且可能有一个,但这是我到目前为止唯一可行的方法。
答案 1 :(得分:1)
不幸的是,您无法从堆栈跟踪或异常中获取参数值。
ListChangedEventArgs
参数提供了各种可能有助于调试的属性:ListChangedType
,NewIndex
,OldIndex
和PropertyDescriptor
。