1

「myResults」というリストがあります。リストに少なくとも 1 つの項目が含まれている場合、リストの情報を含む GridView を作成しようとしています。GridView は「gvMyResults」と呼ばれます。ただし、この DataSource の更新中に、「ロックされている間は境界を変更できません」という例外が発生し、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.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() 
4

1 に答える 1

3

このエラーは、グリッドが有効な状態にないことを示しています。コード スニペットで、データ ソースを非同期的に更新していることに気付きました。Windows フォーム UI プラットフォーム全体で、すべての UI コントロールがスレッド セーフなコントロールではないことを明確にしたいと思います。これは、スレッドセーフな Winforms UI アプリケーションを作成する方法を説明する MSDNの記事です。これは、RadGridView もスレッド セーフではなく、メイン UI スレッドの外では使用できないことを意味します。Invokeを使用して、クロス スレッド シナリオでコントロールを更新する必要があります。例えば:

if (gvMyResults.InvokeRequired)
{
   gvMyResults.Invoke(new MethodInvoker(() => { this.gvMyResults.DataSource = myResults; }));
}
else
{ 
 this.gvMyResults.DataSource = myResults;
}
于 2013-08-02T13:05:18.277 に答える