c# - 调用 OnPaint 时 Infragistics UltraGrid 上的 "Index was outside the bounds of the array"

标签 c# multithreading infragistics onpaint ultrawingrid

我已将网格的 DataSource 绑定(bind)到 BindingSource 对象,我从另一个线程更新该对象。我编写了以下代码:

    protected override void OnPaint(PaintEventArgs pe)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new OnPaintMethodInvoker(this.OnPaint), pe);
        }
        else
        {
            try
            {
                    base.OnPaint(pe);
            }
            catch 
            {
            }
        }
    }

我身上发生了两件事: 1. Invoke 永远不会被调用(我猜 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) 

有人知道可能是什么问题吗? 我尝试将 lock(this) 放在 base.OnPaint(pe) 周围,但没有帮助。

最佳答案

您不应在后台线程上更新绑定(bind)控件的数据源。对您绑定(bind)的列表进行的任何更新都应首先编码回 UI 线程,并且更新应该在那里发生。

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

您可能还想引用Infragistics forums Mike Saltzman 回答了类似的问题。

关于c# - 调用 OnPaint 时 Infragistics UltraGrid 上的 "Index was outside the bounds of the array",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058250/

相关文章:

c# - 是否存在用于从包含给定字符集和计数的输入字符串中查找最小子字符串的 O(n) 算法?

multithreading - OpenMP:堆数组性能较差(堆栈数组工作正常)

.net - .NET CLR线程转储是否与Java的 “kill -3”等效?

jquery - 通过ajax更改数据源时的分页问题 - Infragistics WebDataGrid

c# - 无法连接到 Visual Studio 2012 Express For Web 中的本地数据库 : (error 26)(C#)(SQL Server 2012)

c# - 如何使 FakeItEasy 伪造对象的方法在第一次调用时抛出并在第二次调用时返回?

c# - 文本框输入从右到左,左侧为负号 "-"

c# - 从控制台在新线程上创建表单

asp.net - 同一条线上的两个基础设施控制