C# DataGridViewColumn-设置只读抛出;指数超出范围”;在一个奇怪的情况下
我有一只虫子快把我逼疯了。我有一些通用代码,用于管理(WinForms)应用程序的C# DataGridViewColumn-设置只读抛出;指数超出范围”;在一个奇怪的情况下,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一只虫子快把我逼疯了。我有一些通用代码,用于管理(WinForms)应用程序的DataGridView列。设置列标题文本、宽度、显示索引等等 我让一个用户在加载一个特定屏幕时报告了一个bug。起初,我甚至无法复制它,但我最终发现它发生在(a)一个特定列可见时,以及(b)正好有两行数据时(!)。一行数据,工作正常。如果有两行以上的数据,它就可以正常工作。如果有两行数据,则会失败 DataGridView绑定到一个DataTable 这是失败的代码: private static void Ap
DataGridView
列。设置列标题文本、宽度、显示索引等等
我让一个用户在加载一个特定屏幕时报告了一个bug。起初,我甚至无法复制它,但我最终发现它发生在(a)一个特定列可见时,以及(b)正好有两行数据时(!)。一行数据,工作正常。如果有两行以上的数据,它就可以正常工作。如果有两行数据,则会失败
DataGridView
绑定到一个DataTable
这是失败的代码:
private static void ApplyColumnReadOnly(DataGridViewColumn dgvc, IColumn ci) {
if (dgvc != null && ci != null) {
dgvc.ReadOnly = ci.IsReadOnly;
}
}
IColumn
是我用来存储所有列元数据(列标题、是否可见、显示索引、只读等)的接口。我已经检查了IsReadOnly
属性是否设置正确(如果没有设置,可能会抛出不同的错误)
该列是一个boolean
列,在DataGridView
中显示为复选框
以下是我得到的错误:
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.Collections.ArrayList.get_Item(Int32 index)
at System.Windows.Forms.DataGridViewRowCollection.SharedRow(Int32 rowIndex)
at System.Windows.Forms.DataGridView.SetReadOnlyCellCore(Int32 columnIndex, Int32 rowIndex, Boolean readOnly)
at System.Windows.Forms.DataGridView.RemoveIndividualReadOnlyCellsInColumn(Int32 columnIndex)
at System.Windows.Forms.DataGridView.SetReadOnlyColumnCore(Int32 columnIndex, Boolean readOnly)
at System.Windows.Forms.DataGridViewBand.set_ReadOnly(Boolean value)
at System.Windows.Forms.DataGridViewColumn.set_ReadOnly(Boolean value)
at Ipreo.Orion.Common.DataGridManager.ApplyColumnReadOnly(DataGridViewColumn dgvc, IColumn ci)
因此,我发现的解决方法是手动遍历DataGridView
中的所有行,并手动设置列的ReadOnly
属性,这似乎是上面堆栈跟踪中发生的情况,但我担心这可能无法很好地扩展
正如我提到的,只有当我正好有两行数据要显示时才会发生这种情况,并且只有一个布尔列才会发生这种情况
我已经广泛地搜索了错误和几乎所有来自堆栈跟踪的方法调用,但据我所知,我似乎是第一个报告此类错误的人
任何关于如何继续(通过修复bug或其他调试工具)的建议或指针都将不胜感激 你能分享代码(例如在github中)并让我调试吗?遗憾的是,不能。代码是专有的。如果有帮助的话,我可以添加更多的上下文,但是这个错误比我编写的任何代码都要深七层,这让我感到困惑。在遍历行时,它似乎失败了,而我的代码根本没有显式引用行。您可以使用更简单的演示,而不是专有的。从技术上讲,它都是专有的,但我将看看是否可以在一个简单的示例中重新创建该错误。这将是最好的,在创建此类演示时,也许你自己会发现一些根本原因。你能分享代码(例如在github中)并让我调试一下吗?遗憾的是,不能。代码是专有的。如果有帮助的话,我可以添加更多的上下文,但是这个错误比我编写的任何代码都要深七层,这让我感到困惑。在遍历行时,它似乎失败了,而我的代码根本没有显式引用行。您可以使用更简单的演示,而不是专有的。从技术上讲,它都是专有的,但我将看看是否可以在一个简单的示例中重新创建该错误。这将是最好的,在创建此类演示时,也许你自己会找到一些根本原因。