У меня неприятное исключение, которое, кажется, происходит глубоко внутри кода DataGridView.
У меня есть класс, который наследуется от BindingList, который является источником данных объекта BindingSource, который является источником данных объекта DataGridView.
При некоторых странных обстоятельствах я получаю исключение во время переопределенного метода 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. В получателе одного свойства у меня был код, который изменил другое свойство, вызвавшее событие OnPropertyChanged объекта T instace быть уволенным.
Всего одна простая блокировка (this) в методе BindingList Add, как здесь: Кто-нибудь написал поточно-ориентированный BindingList ‹T›? решил проблему для меня. Трудно отлаживать; (
GetCellDisplayRectangle()
в стеке. Наведите указатель мыши на переменную или параметрrowId
в этой функции, и вы увидите его значение. В качестве альтернативы вы можете создать условную точку останова до возникновения исключения, чтобы прервать выполнение этой функции наrowId==3
. Для этого создайте точку остановаGetCellDisplayRectangle
, щелкните ее правой кнопкой мыши, выберите «Условие» и введите rowId == 3 в диалоговом окне «Условие». Автоматизировать любой процесс можно, но сложно, как показывает ссылка в моем ответе. 08.12.2009