2016-03-26 8 views
0

データセットを介してデータを適用しているグリッドビューを持つwinformがあります。データがバインドされると、SelectionChangedイベントハンドラが呼び出されます。私はそれを調べ、if節を追加してDGVにフォーカスがあるかどうかを調べる方法を見つけました(他のすべての解決策は私が見つけても機能しませんでした)。その部分は計画どおりに働いています。プログラムをステップ実行すると、イベントハンドラはデータをバインドするときにコードを3回実行しようとします。 if節はコードに到達するのを止めます。私の問題は、データがバインドされた後、DGVの行を選択すると、イベントハンドラが "mscorlib.dllで 'System.ArgumentOutOfRangeException'型の未処理例外をスローします。コードをステップ実行するとき、DGVは適切な行インデックスを 'int row'変数に戻していますが、行/セル情報を取得するために使用するコードは 'loadtableID'変数に適用する前にエラーをスローします。私は助けが必要です。一番上の2番目のDGVは無視することができます。選択した行の情報を取得し、別のDBテーブル情報を取得します。また、役立つ場合は、プログラムにデータソースを適用したり、返される個々のデータセットごとにデータセットを作成したりすることはありませんでした。データを返すときにシステムの汎用データセットを使用しています。イベントハンドラwinformを使用してDataGridViewから読み取ろうとするとエラーが発生する

 private void gvMainSelectResults_SelectionChanged(object sender, EventArgs e) 
    { 
     if (gvMainSelectResults.Focused) 
     { 
      gvMainArchiveResults.DataSource = null; //second DGV that is populated later and everytime is cleared with a new selection 

      loadTableID = 0; 
      orgID = 0; 
      dbFileName = ""; 
      sourceType = ""; 

      int row = gvMainSelectResults.CurrentCell.RowIndex; 
      loadTableID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["LoadTableID"].Value); //this is where I get the error, even if the "int row" has the correct index number 
      orgID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["OrganizationID"].Value); 
      dbFileName = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["FileName"].Value); 
      sourceType = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["SourceType"].Value); 

      more code here... 

答えて

0

RowIndex値を使用して、SelectedRowsコレクションからテキストを取得しています。
しかし、このコレクションは

が含まれているユーザーが選択した行のコレクションを取得します。

これは、コレクションにグリッド内にある行のサブセットのみが含まれていることを意味します。 RowIndexが2で、SelectedRowsコレクションに1つの行しかない場合、OutOfRange例外が発生します。あなたが参照しているDGVが同じものではないことを代わりに

loadTableID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["LoadTableID"].Value); 
orgID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["OrganizationID"].Value); 
dbFileName = Convert.ToString(gvMainSelectResults.Rows[row].Cells["FileName"].Value); 
sourceType = Convert.ToString(gvMainSelectResults.Rows[row].Cells["SourceType"].Value); 
+0

Rowsコレクションを参照する必要がありrowIndexに値を持つ

、それは別のものです。私は2(gvMainSelectResults、これは人口が占められているもので、gvMainArchiveResultsは最初の情報を使って2番目のデータを生成するので、新しい行を選択するたびに2番目のDGV自体がクリアされ、新しいデータセットが適用されます) 。そのため、gvMainArchiveResultsがコードの先頭に配置されました。 – Terran28

+0

更新コードと備考 – Terran28

+0

が表示されていますが、今問題が見つかりました。答えを更新する – Steve

関連する問題