0

次のクラス設計からの情報を表示する WinForms のマスター/詳細 Datagridviews のペアがあります。

public class Roads
{
   private List<CrossStreets> _crossStreets = new List<CrossStreets>();
   public string RoadName { get; set; }
   public List<CrossStreet> CrossStreets { get { return _crossStreets;} }        
}

public class CrossStreet
{
   public string CrossStreetName { get; set;}
}

私の実装では、レコードの挿入、更新、および削除が可能であり、BindingSource() の魔法がデータ関係の同期を舞台裏で維持しているようです。私が抱えている問題の 1 つは、ユーザーが詳細ビューでレコードをクリックし、それを選択したままにし、マスター ビューで親レコードではないレコードをクリックしたときです。その時点で、プログラムは System.IndexOutOfRangeException をスローします。これは、子レコードの現在のインデックスを新しい親レコードに適用しようとしているように見えるためです。

これをキャッチするためにRowValidatingなどのイベントでできることがあると思いますが、何がわからないのですか。現在、次のような新しい行とデータ検証の基本的なチェックを行っています。

 private void dataGridSegmentConfig_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {


            if (dataGridViewSegmentConfig.Rows[e.RowIndex].IsNewRow)
            {
                return;
            }

//data validation logic here.
}
4

1 に答える 1

0

datagridview は、選択された親行に基づいて子行のインデックスを設定しようとしています。親のレコードが子行の選択されたインデックスよりも少ない場合、IndexOutOfRangeException がスローされます。これを回避するために、親行が変更された場合は必ず子セルを null に設定します。

  private void dataGridRouteConfig_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
        {
            //fix for clicking the detail and then clicking a different parent.
            dataGridViewSegmentConfig.CurrentCell = null;

        }
于 2013-01-25T17:42:53.867 に答える