When I sort my grid on certain columns and then change the data bound to the grid from a thread other than the main UI thread, I sometimes get a null reference exception.
My setup is basically this:
_gridView.DataSource = myObject.Children;
// user sorts grid
// user requests update from server
make BackgroundWorker to pull from server and update myObject.Children (fields of existing objects and add/remove from list)
show progress dialog on UI thread while data is being pulled from server and put into Children on BackgroundWorker thread
I get this exception:
Looking at my worker thread state when this exception occurs, I get this more complete looking call stack. It looks like this should perhaps being doing an Invoke to move these changes to the grid back to the UI thread.
My setup is basically this:
_gridView.DataSource = myObject.Children;
// user sorts grid
// user requests update from server
make BackgroundWorker to pull from server and update myObject.Children (fields of existing objects and add/remove from list)
show progress dialog on UI thread while data is being pulled from server and put into Children on BackgroundWorker thread
I get this exception:
System.NullReferenceException {"Object reference not set to an instance of an object."}
at Telerik.Collections.Generic.AvlTree`1.FixInsert(AvlTreeNode`1 t, AvlTreeNode`1 u, Int32[] ad, Int32 n)
at Telerik.Collections.Generic.AvlTree`1.Insert(Int32 index, ValueT value)
at Telerik.Collections.Generic.AvlTree`1.InsertWithDuplicates(ValueT value)
at Telerik.Collections.Generic.AvlTree`1.Add(ValueT item)
at Telerik.WinControls.Data.AvlIndex`1.Perform()
at Telerik.WinControls.Data.AvlIndex`1.get_Items()
at Telerik.WinControls.Data.RadDataView`1.get_Items()
at Telerik.WinControls.Data.RadCollectionView`1.GetEnumerator()
at Telerik.WinControls.UI.GridViewInfo.Refresh()
at Telerik.WinControls.UI.GridViewInfo.get_ChildRows()
at Telerik.WinControls.UI.GridViewTemplate.get_ChildRows()
at Telerik.WinControls.UI.GridViewRowInfo.get_Index()
at Telerik.WinControls.UI.GridDataRowElement.UpdateAlternatingRowColor()
at Telerik.WinControls.UI.GridDataRowElement.ApplyCustomFormatting()
at Telerik.WinControls.UI.GridRowElement.UpdateInfo()
at Telerik.WinControls.UI.GridDataRowElement.UpdateInfo()
at Telerik.WinControls.UI.GridRowElement.Initialize(GridViewRowInfo rowInfo)
at Telerik.WinControls.UI.GridRowElement.Attach(GridViewRowInfo row, Object context)
at Telerik.WinControls.UI.BaseVirtualizedContainer`1.InsertElement(Int32 position, IVirtualizedElement`1 element, T data)
at Telerik.WinControls.UI.BaseVirtualizedContainer`1.UpdateElement(Int32 position, T data)
at Telerik.WinControls.UI.ScrollableRowsContainerElement.UpdateElement(Int32 position, GridViewRowInfo data)
at Telerik.WinControls.UI.BaseVirtualizedContainer`1.MeasureElements()
at Telerik.WinControls.UI.BaseVirtualizedContainer`1.MeasureOverride(SizeF availableSize)
at Telerik.WinControls.UI.ScrollableRowsContainerElement.MeasureOverride(SizeF availableSize)
at Telerik.WinControls.RadElement.MeasureCore(SizeF availableSize)
at Telerik.WinControls.RadElement.Measure(SizeF availableSize)
at Telerik.WinControls.UI.RowsContainerElement.MeasureOverride(SizeF availableSize)
at Telerik.WinControls.RadElement.MeasureCore(SizeF availableSize)
at Telerik.WinControls.RadElement.Measure(SizeF availableSize)
at Telerik.WinControls.Layouts.ContextLayoutManager.UpdateLayout()
at Telerik.WinControls.Layouts.ContextLayoutManager.UpdateLayoutCallback(ILayoutManager manager)
Looking at my worker thread state when this exception occurs, I get this more complete looking call stack. It looks like this should perhaps being doing an Invoke to move these changes to the grid back to the UI thread.
[Managed to Native Transition]
mscorlib.dll!System.Type.IsVisible.get() + 0x23 bytes
System.dll!System.SecurityUtils.MethodInfoInvoke(System.Reflection.MethodInfo method, object target, object[] args) + 0x30 bytes
System.dll!System.ComponentModel.ReflectPropertyDescriptor.GetValue(object component) + 0x5f bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<
System.__Canon
>.GetBoundValue(object dataBoundItem, string propertyName) + 0x3a bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.BoundAccessor.this[Telerik.WinControls.UI.GridViewRowInfo].get(Telerik.WinControls.UI.GridViewRowInfo row) + 0xb7 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewDateTimeColumn.GetValue(Telerik.WinControls.UI.GridViewRowInfo row, Telerik.WinControls.UI.GridViewDataOperation operation) + 0x15 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewRowInfoComparer.CompareRows(Telerik.WinControls.UI.GridViewRowInfo x, Telerik.WinControls.UI.GridViewRowInfo y, Telerik.WinControls.Data.SortDescriptorCollection context) + 0x93 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewRowInfoComparer.Compare(Telerik.WinControls.UI.GridViewRowInfo x, Telerik.WinControls.UI.GridViewRowInfo y) + 0xe bytes
Telerik.WinControls.dll!Telerik.Collections.Generic.AvlTree<
Telerik.WinControls.UI.GridViewRowInfo
>.Insert(Telerik.WinControls.UI.GridViewRowInfo value, bool duplicateallowed, bool overwrite) + 0x114 bytes
Telerik.WinControls.dll!Telerik.Collections.Generic.AvlTree<
System.__Canon
>.InsertWithDuplicates(System.__Canon value) + 0x32 bytes
Telerik.WinControls.dll!Telerik.Collections.Generic.AvlTree<
System.__Canon
>.Add(System.__Canon item) + 0x5 bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.AvlIndex<
Telerik.WinControls.UI.GridViewRowInfo
>.Perform() + 0x2ff bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.AvlIndex<
Telerik.WinControls.UI.GridViewRowInfo
>.Items.get() + 0x10 bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadDataView<
System.__Canon
>.Items.get() + 0xe bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<
Telerik.WinControls.UI.GridViewRowInfo
>.GetEnumerator() + 0x11 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewInfo.Refresh() + 0x213 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewInfo.ChildRows.get() + 0x1f bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewTemplate.ChildRows.get() + 0xa bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.ViewInfoTraverser.SetCollectionForStage(bool initializeCollection) + 0x138 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.ViewInfoTraverser.ChangeCollectionForward() + 0x49 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.ViewInfoTraverser.MoveNextCore() + 0x33 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.ViewInfoTraverser.MoveNext() + 0x3a bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTraverser.MoveNextCore() + 0x42 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTraverser.MoveNext() + 0xd bytes
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.ItemScroller<
Telerik.WinControls.UI.GridViewRowInfo
>.UpdateScrollRange() + 0x60 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.RowScroller.UpdateScrollRange() + 0x19 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTableElement.UpdateWhenItemChanged(Telerik.WinControls.UI.DataViewChangedEventArgs args) + 0x94 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTableElement.UpdateViewCore(object sender, Telerik.WinControls.UI.DataViewChangedEventArgs args) + 0x1ed bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTableElement.UpdateView(object sender, Telerik.WinControls.UI.DataViewChangedEventArgs args) + 0x4e bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTableElement.ProcessTemplateEvent(Telerik.WinControls.UI.GridViewEvent eventData) + 0xc7 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridTableElement.Telerik.WinControls.UI.IGridViewEventListener.ProcessEvent(Telerik.WinControls.UI.GridViewEvent eventData) + 0x196 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(Telerik.WinControls.UI.GridViewEvent gridEvent, Telerik.WinControls.UI.PriorityWeakReferenceList list, Telerik.WinControls.UI.GridEventProcessMode processMode) + 0xa4 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(Telerik.WinControls.UI.GridViewEvent gridEvent) + 0x35 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(Telerik.WinControls.UI.GridViewEvent gridEvent) + 0x8a bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents() + 0xda bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(Telerik.WinControls.UI.GridViewEvent gridEvent) + 0x61 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(Telerik.WinControls.UI.GridViewTemplate template, Telerik.WinControls.UI.GridViewEvent eventData, bool postUI) + 0x18b bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewTemplate.DispatchEvent(Telerik.WinControls.UI.GridViewEvent gridEvent, bool postUI) + 0xb bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewTemplate.DispatchDataViewChangedEvent(object sender, Telerik.WinControls.UI.DataViewChangedEventArgs args) + 0xa2 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewTemplate.OnViewChanged(object sender, Telerik.WinControls.UI.DataViewChangedEventArgs e) + 0x49 bytes
Telerik.WinControls.GridView.dll!Telerik.WinControls.UI.GridViewTemplate.CollectionView_CollectionChanged(object sender, Telerik.WinControls.Data.NotifyCollectionChangedEventArgs e) + 0x2e bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<
System.__Canon
>.OnCollectionChanged(Telerik.WinControls.Data.NotifyCollectionChangedEventArgs args) + 0x3f bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadDataView<
Telerik.WinControls.UI.GridViewRowInfo
>.ProcessCollectionChanged(Telerik.WinControls.Data.NotifyCollectionChangedEventArgs args) + 0x11b bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<
System.__Canon
>.source_CollectionChanged(object sender, Telerik.WinControls.Data.NotifyCollectionChangedEventArgs e) + 0x23 bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<
System.__Canon
>.OnCollectionChanged(Telerik.WinControls.Data.NotifyCollectionChangedEventArgs e) + 0x1e bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<
System.__Canon
>.ChangeItem(int index, System.__Canon item, string propertyName) + 0xc2 bytes
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<
System.__Canon
>.currencyManager_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x125 bytes
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnListChanged(System.ComponentModel.ListChangedEventArgs e) + 0x15 bytes
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.List_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e) + 0x53e bytes
System.Data.Entity.dll!System.Data.Objects.ObjectView<
System.__Canon
>.OnListChanged(System.ComponentModel.ListChangedEventArgs changeArgs) + 0x1f bytes
System.Data.Entity.dll!System.Data.Objects.ObjectView<
DataAccess.Child
>.System.Data.Objects.IObjectView.EntityPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + 0x4d bytes
System.Data.Entity.dll!System.Data.Objects.ObjectViewListener.EntityPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + 0x31 bytes
System.Data.Entity.dll!System.Data.Objects.DataClasses.StructuralObject.OnPropertyChanged(string property) + 0x31 bytes
System.Data.Entity.dll!System.Data.Objects.DataClasses.StructuralObject.ReportPropertyChanged(string property) + 0x23 bytes
System.Data.Entity.dll!System.Data.Objects.DataClasses.EntityObject.ReportPropertyChanged(string property) + 0x50 bytes