0

我的代码中有以下逻辑。

Initialize(){
    DataGridView view = new DataGridView();
    view.BindingSource = bs;
    bs.dataSource = dataTable;

    //Fill Data Table using Adapter.
    da.fill(dataTable);
}

CallMeEveryFewMinutes(DataTable dataTable){
    List<String> changed = findChangedOjbects();
    // Fill datatable2 with changed objects.
    da2.fill(datatable2, changed)     

    Refresh(dataTable, datatable2);
    // dataTable is now refreshed. Bind it again so changes are reflected.

    // ********** PROBLEM AREA ***************
    // once in a while it throws the below exception.
    bs.dataSource = dataTable;
} 

不仅如此,它还会为 datagridview.sort(...) 抛出相同的异常 - 偶尔..

任何指针都会非常有帮助。

System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围。参数名称: System.Windows.Forms.DataGridView.GetCellAdjustedDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow) 处 System.Windows.Forms.DataGridView.GetCellDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow) 处的 rowIndex .DataGridView.InvalidateCellPrivate(Int32 columnIndex, Int32 rowIndex) 在 System.Windows.Forms.DataGridView.OnCellCommonChange(Int32 columnIndex, Int32 rowIndex) 在 System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(ListChangedEventArgs e) 在 System.Windows.Forms .DataGridView。

4

2 回答 2

0

我发现了一个很好的提示

http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/279d3c64-c1c2-4927-b0cc-79866c09e035/

“我想通了,但发布在另一个线程上。基本上,已经建立了自己的数据索引的货币管理器正在变得异常。在我的集合对象中,我允许自己传入 datagridview 对象,这样如果任何东西都会被删除,我可以调用 bindingmanager.resetcurrentbindings。如果你在删除后重置绑定,那么这将避免这个错误。

所以,我稍微改变了我的代码,问题(看起来)现在已经解决了。

Initialize(){
    DataGridView view = new DataGridView();
    view.BindingSource = bs;
    bs.dataSource = dataTable;

    //Fill Data Table using Adapter.
    da.fill(dataTable);
}

CallMeEveryFewMinutes(DataTable dataTable){
    List<String> changed = findChangedOjbects();
    // Fill datatable2 with changed objects.
    da2.fill(datatable2, changed)     

    Refresh(dataTable, datatable2);
    // dataTable is now refreshed. Bind it again so changes are reflected.

    // ********** PROBLEM AREA -- SOLVED ***************
    // once in a while it throws the below exception.
    //bs.dataSource = dataTable; don't rebind the same datatable, but rather reset the bindings.
    bs.ResetBindings(false);
} 
于 2012-07-03T18:37:16.033 回答
0

我在这里的假设是,由于您修改数据并将其重新绑定到控件,因此正在调用一些侦听网格本身的事件。无论是 SelectionChanged 还是 RowRemoved,您基本上都是在尝试对没有数据的 Gridview 运行这些调用。

检查您的事件侦听器,看看您是否有任何对尝试访问网格中数据的方法的调用。您甚至可以在程序中放置一些断点,以查看这些方法被调用的顺序。重新绑定发生时,请注意调用代码的顺序。

为了解决这个问题,在事件监听器上检查 dgv.Rows.Count 是否等于 0。

于 2012-07-03T15:25:34.363 回答