2013-07-30 34 views
1

我有一個名爲「myResults」的列表。當列表包含至少一個項目時,我正在嘗試爲列表填充GridView w/info; GridView被稱爲「gvMyResults」。但是,有時候,在DataSource的這次更新過程中,我得到一個異常說:「鎖定時邊界不能改變」,並且在我的GridView中顯示一個紅色的X.我在我的更新中添加了這個Dispatcher包裝器,但我仍然看到相同的錯誤。這很難排除故障,因爲它不會每次都發生。另外,這個GridView是一個Telerik RadGridView。GridView更新時出現「鎖定時無法更改邊界」

有誰知道如何阻止「邊界鎖定時無法更改」錯誤?

if (myResults.Count > 0) 
{ 
    Dispatcher.CurrentDispatcher.Invoke(
     DispatcherPriority.Normal, 
     (Action)delegate() 
    { 
     this.gvMyResults.DataSource = myResults; 
    }); 
} 

我已經試過這爲好,但我得到了同樣的異常:

_Context.Send(x => 
{ 
    this.gvMyResults.DataSource = myResults; 
}, null); 

異常/棧跟蹤(的要求):

Type=System.InvalidOperationException 
Source=Telerik.WinControls 
Message=Bounds cannot be changed while locked. 
StackTrace: 
    at Telerik.WinControls.RadElement.SetBoundsCore(Rectangle bounds) 
    at Telerik.WinControls.RadElement.set_Size(Size value) 
    at Telerik.WinControls.RadElement.SetLayoutParams(PointF newOffset, SizeF newSize) 
    at Telerik.WinControls.RadElement.ArrangeCore(RectangleF finalRect) 
    at Telerik.WinControls.RadElement.Arrange(RectangleF finalRect) 
    at Telerik.WinControls.UI.RowsContainerElement.ArrangeOverride(SizeF finalSize) 
    at Telerik.WinControls.RadElement.ArrangeCore(RectangleF finalRect) 
    at Telerik.WinControls.RadElement.Arrange(RectangleF finalRect) 
    at Telerik.WinControls.UI.ScrollViewElement`1.ArrangeViewElement(RectangleF viewElementRect) 
    at Telerik.WinControls.UI.ScrollViewElement`1.ArrangeOverride(SizeF finalSize) 
    at Telerik.WinControls.RadElement.ArrangeCore(RectangleF finalRect) 
    at Telerik.WinControls.RadElement.Arrange(RectangleF finalRect) 
    at Telerik.WinControls.Layouts.ContextLayoutManager.UpdateLayout() 
    at Telerik.WinControls.RadElement.UpdateLayout() 
    at Telerik.WinControls.UI.GridVisibilityHelper.EnsureRowVisible(GridViewRowInfo rowInfo) 
    at Telerik.WinControls.UI.GridTableElement.EnsureRowVisible(GridViewRowInfo rowInfo) 
    at Telerik.WinControls.UI.GridTableElement.EnsureCellVisible(GridViewRowInfo rowInfo, GridViewColumn column) 
    at Telerik.WinControls.UI.GridTableElement.UpdateViewCore(Object sender, DataViewChangedEventArgs args) 
    at Telerik.WinControls.UI.GridTableElement.UpdateView(Object sender, DataViewChangedEventArgs args) 
    at Telerik.WinControls.UI.GridTableElement.ProcessTemplateEvent(GridViewEvent eventData) 
    at Telerik.WinControls.UI.GridTableElement.Telerik.WinControls.UI.IGridViewEventListener.ProcessEvent(GridViewEvent eventData) 
    at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(GridViewEvent gridEvent, PriorityWeakReferenceList list, GridEventProcessMode processMode) 
    at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(GridViewEvent gridEvent) 
    at Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(GridViewEvent gridEvent) 
    at Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents() 
    at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewEvent gridEvent) 
    at Telerik.WinControls.UI.GridViewSynchronizationService.RaiseCurrentChanged(GridViewTemplate template, GridViewRowInfo row, GridViewColumn column, Boolean user) 
    at Telerik.WinControls.UI.GridViewTemplate.CollectionView_CurrentChanged(Object sender, EventArgs e) 
    at System.EventHandler.Invoke(Object sender, EventArgs e) 
    at Telerik.WinControls.Data.RadCollectionView`1.OnCurrentChanged(EventArgs args) 
    at Telerik.WinControls.Data.RadCollectionView`1.SetCurrentPositionCore(Int32 newPosition, Boolean forceNotify, CurrentChangeReason reason) 
    at Telerik.WinControls.Data.RadDataView`1.SyncCurrent(TDataItem item) 
    at Telerik.WinControls.Data.RadDataView`1.RebuildData(Boolean notify) 
    at Telerik.WinControls.Data.RadDataView`1.RefreshOverride() 
    at Telerik.WinControls.Data.RadDataView`1.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at Telerik.WinControls.Data.RadCollectionView`1.source_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 
    at Telerik.WinControls.Data.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 
    at Telerik.WinControls.Data.RadListSource`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    at Telerik.WinControls.Data.RadListSource`1.EndUpdate(Boolean notifyUpdates) 
    at Telerik.WinControls.Data.RadListSource`1.Initialize() 
    at Telerik.WinControls.Data.RadListSource`1.Bind(Object dataSource, String dataMember) 
    at Telerik.WinControls.Data.RadListSource`1.set_DataSource(Object value) 
    at Telerik.WinControls.UI.GridViewTemplate.set_DataSource(Object value) 
    at Telerik.WinControls.UI.RadGridView.set_DataSource(Object value) 
    at MyProject.MyWindow.<>c__DisplayClass2.<DisplayCallerInfo>b__0() 
+1

我們對Telerik的論壇上張貼的,但還沒有聽說過任何事情 - [鏈接](http://www.telerik.com/community/forums/winforms/gridview/bounds - 無法更改,而鎖定在gridview-update.aspx) – WEFX

+1

堆棧跟蹤呢? –

+0

@KingKing - 我已經添加了堆棧跟蹤。謝謝 – WEFX

回答

2

此錯誤指示網格不在有效狀態。我在代碼片段中注意到你異步更新數據源,我想澄清一下,在整個Windows Forms UI平臺中,所有的UI控件都不是線程安全的控件。這是MSDN上的article,它描述瞭如何製作線程安全的Winforms UI應用程序。這意味着RadGridView也不是線程安全的,不能在主UI線程之外使用。您應該使用Invoke更新跨線程場景中的控件。例如:

if (gvMyResults.InvokeRequired) 
{ 
    gvMyResults.Invoke(new MethodInvoker(() => { this.gvMyResults.DataSource = myResults; })); 
} 
else 
{ 
this.gvMyResults.DataSource = myResults; 
} 
+0

謝謝@Ajay。我會對此進行測試,然後相應地獎勵賞金。 – WEFX

+0

希望這會對你有幫助 –

+0

@WEFX是否有效? –