C# &引用;索引超出了数组的边界;调用OnPaint时在Infragistics UltraGrid上

C# &引用;索引超出了数组的边界;调用OnPaint时在Infragistics UltraGrid上,c#,multithreading,infragistics,onpaint,ultrawingrid,C#,Multithreading,Infragistics,Onpaint,Ultrawingrid,我已经将网格的数据源绑定到一个BindingSource对象,并从另一个线程更新该对象。我编写了以下代码: protected override void OnPaint(PaintEventArgs pe) { if (this.InvokeRequired) { this.Invoke(new OnPaintMethodInvoker(this.OnPaint), pe); } else

我已经将网格的数据源绑定到一个BindingSource对象,并从另一个线程更新该对象。我编写了以下代码:

    protected override void OnPaint(PaintEventArgs pe)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new OnPaintMethodInvoker(this.OnPaint), pe);
        }
        else
        {
            try
            {
                    base.OnPaint(pe);
            }
            catch 
            {
            }
        }
    }
有两件事发生在我身上: 1.调用从未被调用(我想ultragrid知道如何处理它) 2.当我在更新数据时播放屏幕(鼠标悬停/调整大小)时,我收到以下异常:

索引超出了数组的边界

    at Infragistics.Shared.SparseArray.GetItemAtScrollIndex(Int32 scrollIndex, ICreateItemCallback createItemCallback)
   at Infragistics.Win.UltraWinGrid.ScrollCountManagerSparseArray.GetItemAtScrollIndex(Int32 scrollIndex, Boolean allocate)
   at Infragistics.Win.UltraWinGrid.RowsCollection.GetRowAtScrollIndex(Int32 scrollIndex, Boolean allocate)
   at Infragistics.Win.UltraWinGrid.RowsCollection.get_IsLastScrollableRowNotAllocatedYet()
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.IsLastScrollableRowVisible(ScrollbarVisibility colScrollbarVisibility)
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.GetMaxScrollPosition(Boolean scrollToFill)
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.EnsureScrollRegionFilled(Boolean calledFromRegenerateVisibleRows)
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.RegenerateVisibleRows(Boolean resetScrollInfo)
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.RegenerateVisibleRows()
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.WillScrollbarBeShown(ScrollbarVisibility assumeColScrollbarsVisible)
   at Infragistics.Win.UltraWinGrid.ScrollRegionBase.WillScrollbarBeShown()
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.PositionScrollbar(Boolean resetScrollInfo)
   at Infragistics.Win.UltraWinGrid.ScrollRegionBase.SetOriginAndExtent(Int32 origin, Int32 extent)
   at Infragistics.Win.UltraWinGrid.RowScrollRegion.SetOriginAndExtent(Int32 origin, Int32 extent)
   at Infragistics.Win.UltraWinGrid.DataAreaUIElement.ResizeRowScrollRegions()
   at Infragistics.Win.UltraWinGrid.DataAreaUIElement.PositionChildElements()
   at Infragistics.Win.UIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UltraWinGrid.DataAreaUIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UltraWinGrid.DataAreaUIElement.set_Rect(Rectangle value)
   at Infragistics.Win.UltraWinGrid.UltraGridUIElement.PositionChildElements()
   at Infragistics.Win.UIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UltraWinGrid.UltraGridUIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UIElement.DrawHelper(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Boolean clipText, Boolean forceDrawAsFocused, Boolean preventAlphaBlendGraphics)
   at Infragistics.Win.UIElement.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Boolean forceDrawAsFocused, Boolean preventAlphaBlendGraphics)
   at Infragistics.Win.ControlUIElementBase.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Size elementSize, Boolean preventAlphaBlendGraphics)
   at Infragistics.Win.ControlUIElementBase.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Size elementSize)
   at Infragistics.Win.ControlUIElementBase.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode)
   at Infragistics.Win.UltraWinGrid.UltraGridUIElement.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode)
   at Infragistics.Win.UltraControlBase.OnPaint(PaintEventArgs pe)
   at Infragistics.Win.UltraWinGrid.UltraGrid.OnPaint(PaintEventArgs pe)
   at MyProject.Common.UI.Controls.GridControl.OnPaint(PaintEventArgs pe) 
有人知道问题出在哪里吗?
我试图在base.OnPaint(pe)周围设置锁(此),但没有任何帮助。

您不应该在后台线程上更新绑定控件的数据源。对绑定到的列表所做的任何更新都应该首先封送回UI线程,并且更新应该在那里发生

当您在后台线程上更新WinGrid绑定到的列表时,会触发事件处理程序,该事件处理程序响应要在后台线程而不是UI线程上执行的数据更改,这会导致问题,因为只有少数成员实际上是线程安全的


您还可以参考Mike Saltzman回答类似问题的地方。

您不应该锁定
。请参阅此答案以获得解释:感谢您的回答和linkWell,它并没有真正帮助我,因为我的数据源正在另一个项目中更新,该项目不知道UI,我不想冻结UI,直到它将结束更新数据,因为网格不是线程安全的!如何破解?从UI线程更新数据源。Jeffrey Richter关于将应用程序的线程模型与异步编程模型集成的博客文章可能会帮助您: