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.GetCellDisplayRectangle の rowIndex(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow) System.Windows.Forms.DataGridView.GetCellAdjustedDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow) at System.Windows.Forms .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

ここでの私の仮定は、データを変更し、それをコントロールに再バインドしたために、グリッド自体をリッスンするイベントが呼び出されているということです。それがSelectionChangedであろうと、おそらくRowRemovedであろうと、基本的に、データが含まれていないGridviewに対してこれらの呼び出しを実行しようとしています。

イベントリスナーをチェックし、グリッド内のデータにアクセスしようとするメソッドの呼び出しがあるかどうかを確認します。プログラム内にいくつかのブレークポイントを配置して、これらのメソッドが呼び出されている順序を確認することもできます。再バインドが発生したら、コードが呼び出される順序に注意してください。

これを修正するには、イベントリスナーで、dgv.Rows.Countが0に等しいかどうかを確認します。

于 2012-07-03T15:25:34.363 に答える
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 に答える