C# &引用;“锁定时无法更改边界”;关于GridView更新

C# &引用;“锁定时无法更改边界”;关于GridView更新,c#,winforms,telerik,radgridview,C#,Winforms,Telerik,Radgridview,我有一个名为“我的结果”的列表。当列表至少包含一项时,我将尝试填充一个GridView,其中包含列表的信息;GridView称为“gvMyResults”。然而,有时,在数据源的更新过程中,我会收到一个异常,它说,“边界在锁定时无法更改”,并且在我的GridView中显示一个红色的X。我在更新的周围添加了这个Dispatcher包装器,但仍然看到相同的错误。很难排除故障,因为它不是每次都发生。此外,此GridView是Telerik RadGridView 有人知道如何停止这个“锁定时无法更改边

我有一个名为“我的结果”的列表。当列表至少包含一项时,我将尝试填充一个GridView,其中包含列表的信息;GridView称为“gvMyResults”。然而,有时,在数据源的更新过程中,我会收到一个异常,它说,“边界在锁定时无法更改”,并且在我的GridView中显示一个红色的X。我在更新的周围添加了这个Dispatcher包装器,但仍然看到相同的错误。很难排除故障,因为它不是每次都发生。此外,此GridView是Telerik RadGridView

有人知道如何停止这个“锁定时无法更改边界”错误吗

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.WinControl
消息=锁定时无法更改边界。
堆栈跟踪:
在Telerik.WinControls.RadElement.SetBoundsCore(矩形边界)
在Telerik.WinControl.RadElement.set_尺寸(尺寸值)
在Telerik.WinControls.RadElement.SetLayoutParams(PointF newOffset,SizeF newSize)
在Telerik.WinControl.RadElement.ArrangeCore(矩形最终效果)
在Telerik.WinControl.RadElement.Arrange(矩形最终效果)
在Telerik.WinControls.UI.RowsContainerElement.ArrangeOverride(SizeF finalSize)中
在Telerik.WinControl.RadElement.ArrangeCore(矩形最终效果)
在Telerik.WinControl.RadElement.Arrange(矩形最终效果)
在Telerik.WinControls.UI.ScrollViewElement`1.ArrangeViewElement(矩形视图元素Rect)
在Telerik.WinControls.UI.ScrollViewElement`1.ArrangeOverride(SizeF finalSize)
在Telerik.WinControl.RadElement.ArrangeCore(矩形最终效果)
在Telerik.WinControl.RadElement.Arrange(矩形最终效果)
在Telerik.WinControls.Layouts.ContextLayoutManager.UpdateLayout()中
在Telerik.WinControls.RadElement.UpdateLayout()上
位于Telerik.WinControls.UI.GridVisibilityHelper.EnsureRowVisible(GridViewRowInfo rowInfo)
位于Telerik.WinControls.UI.GridTableElement.EnsureRowVisible(GridViewRowInfo rowInfo)
在Telerik.WinControls.UI.GridTableElement.EnsureCellVisible(GridViewRowInfo行信息,GridViewColumn列)
在Telerik.WinControls.UI.GridTableElement.UpdateViewCore(对象发送者,DataViewChangedEventArgs参数)
在Telerik.WinControls.UI.GridTableElement.UpdateView(对象发送者,DataViewChangedEventArgs参数)
位于Telerik.WinControls.UI.GridTableElement.ProcessTemplateEvent(GridViewEvent事件数据)
位于Telerik.WinControls.UI.GridTableElement.Telerik.WinControls.UI.IGridViewEventListener.ProcessEvent(GridViewEventData)
在Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(GridViewEvent gridEvent、PriorityWeakReferenceList、GridEventProcessMode processMode)
在Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(GridViewEvent gridEvent)中
位于Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(GridViewEvent gridEvent)
在Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents()中
在Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewEvent gridEvent)上
在Telerik.WinControls.UI.GridViewSynchronizationService.RaiseCurrentChanged(GridViewTemplate模板、GridViewRowInfo行、GridViewColumn列、布尔用户)
在Telerik.WinControls.UI.GridViewTemplate.CollectionView\u CurrentChanged(对象发送方,事件参数e)
在System.EventHandler.Invoke(对象发送方,EventArgs e)
在Telerik.WinControl.Data.RadCollectionView`1.OnCurrentChanged(事件args args)
在Telerik.WinControl.Data.RadCollectionView`1.SetCurrentPositionCore(Int32 newPosition、Boolean forceNotify、CurrentChangeReason)
at Telerik.WinControls.Data.RadDataView`1.SyncCurrent(TDataItem)
在Telerik.WinControls.Data.RadDataView`1.重建数据(布尔通知)
在Telerik.WinControls.Data.RadDataView`1.RefreshOverride()中
在Telerik.WinControls.Data.RadDataView`1.ProcessCollectionChanged(NotifyCollectionChangedEventArgs)
在Telerik.WinControls.Data.RadCollectionView`1.source\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
在Telerik.WinControls.Data.NotifyCollectionChangedEventHandler.Invoke(对象发送方,NotifyCollectionChangedEventArgs e)
在Telerik.WinControl.Data.RadListSource`1.OnCollectionChanged(通知CollectionChangedEventArgs e)
在Telerik.WinControls.Data.RadListSource`1.EndUpdate(布尔更新)
在Telerik.WinControls.Data.RadListSource`1.Initialize()中
在Telerik.WinControls.Data.RadListSource`1.Bind(对象数据源,字符串数据成员)
在Telerik.WinControls.Data.RadListSource`1.set_数据源(对象值)
在Telerik.WinControls.UI.GridViewTemplate.set_数据源(对象值)
在Telerik.WinControls.UI.RadGridView.set_数据源(对象值)
在MyProject.MyWindow.c__DisplayClass2.b__0()中

此错误表示网格未处于有效状态。我在代码片段中注意到您异步更新了数据源,我想澄清一下,在整个Windows窗体UI平台中,所有UI控件都不是线程安全控件。下面是一个关于MSDN的示例,描述了如何创建线程安全的Winforms UI应用程序。这意味着RadGridView也不是线程安全的,不能在主UI线程之外使用。您应该使用来更新跨线程场景中的控件。例如:

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

我们也在Telerik的论坛上发布过,但还没有听到任何消息-堆栈跟踪呢?@KingKing-我添加了堆栈跟踪。感谢这些控件不是线程安全的。您是否尝试过gvMyResults.Invoke(newmethodinvoker(()=>{this.gvMyResults.DataSource=myResults;}));谢谢@Ajay。我将对此进行测试,并在之后相应地授予赏金。希望这将对您有所帮助。到目前为止,它似乎正在发挥作用。我应该完成洛杉矶的测试
if (gvMyResults.InvokeRequired)
{
   gvMyResults.Invoke(new MethodInvoker(() => { this.gvMyResults.DataSource = myResults; }));
}
else
{ 
 this.gvMyResults.DataSource = myResults;
}