セットアップ: 2 つの DataGridView があり、それぞれがカスタム ビジネス オブジェクトの BindingList<> にバインドされています。これらのグリッドには、そのグリッド内のすべての行の数学的合計を含む特別な行があります。この特別な行は、BindingList<> 内の対応する特別なオブジェクトを反映しています (これが追加される行ではないことがわかるように指定します)。 DGV に追加されますが、オブジェクトは BindingList<> に追加されます)。
エラー: 定期的に、Totals Row オブジェクトを見つけて BindingList<> (したがって DGV) から削除する必要があります。これを行うために使用していた元のコードは次のとおりです。
private void RemoveTotalRow()
{
for (int i = UnderlyingGridList.Count - 1; i >= 0; i--)
{
if (UnderlyingGridList[i].IsTotalRow) UnderlyingGridList.RemoveAt(i);
}
}
(それほど重要ではありませんが、すべてのレコードを繰り返し表示しているのは、誤って合計行が複数になる可能性を防ぐためです)。このコードは、2 つのグリッドのいずれかに対して、すべての状況で問題なく動作します。ただし、2 番目のグリッドでは、RemoveAt メソッドが呼び出されると次のエラーが発生します。
The following exception occurred in the DataGridView: System.IndexOutOfRangeException: Index 5 does not have a value. at System.Windows.Forms.CurrencyManager.get_Item(Int32 index) at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex) To replace this default dialog please handle the DataError event.
...ここで、「5」は合計行のインデックスです。 私はこの質問を見つけましたが、これは基本的に同じですが、受け入れられた答えは次のいずれかです: 1) 基になるリストを使用しないでください。上記のコード例の最も内側のメソッド呼び出しを次のように置き換えて、#2 を試しました。
if (UnderlyingGridList[i].IsTotalRow) brokenDataGrid.Rows.RemoveAt(i);
これは同じエラーをスローします。 変更後に再バインドすることを提案するこの質問も見つけました - ただし、このコードは1秒に1回呼び出される可能性があり、リストのデータが多すぎるとグリッドが使用できなくなるため、これは現実的ではありません(私はこれを知っています)悪い経験から)。
グリッドの DataError イベントを処理することもできますが、1 分間に 100 万個のエラーが発生しないようにしたいと考えています。どんな助けでも大歓迎です。