2016-03-27 7 views
0

この問題を解決するためにすべての実験を行いましたが、何も動作しません。私は選択された行をデータテーブルから取得しようとしています。私は最初の行を選択し、データテーブルにデータを解析するためのリンクをクリックするとうまくいきますが、2番目の行を選択すると、範囲外のエラーが発生します。以下は私のコードですWindowsフォームでDataGridviewの2番目の行を選択したときに範囲外のエラーが発生する

private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      int rowindex = dataGridView1.CurrentCell.RowIndex; 

      dt.Clear(); 
      dt.Columns.Add("CustomerId", typeof(string)); 
      dt.Columns.Add("Style", typeof(string)); 
      dt.Columns.Add("BookingId", typeof(string)); 


      DataRow dr = dt.NewRow(); 

      dr["CustomerId"] = dataGridView1.SelectedRows[rowindex].Cells["CustomerId"].Value; //I get the error here 
      dr["Style"] = dataGridView1.SelectedRows[rowindex].Cells["Style"].Value; 
      dr["BookingId"] = dataGridView1.SelectedRows[rowindex].Cells["BookingId"].Value; 

      dt.Rows.Add(dr); 

      Form3 fr = new Form3(dt); 
      fr.Show(); 
      this.Hide(); 
     } 

本当に混乱しています。助けてください

+0

行がありますどのように多くの? – mostafa8026

答えて

2

RowIndexあなたはdataGridView1.CurrentCell.RowIndexに実際にDataGridViewの行インデックスではなく、SelectedRowsのインデックスではありません。

コードを次のように変更します。

dr["CustomerId"] = dataGridView1.Rows[rowindex].Cells["CustomerId"].Value; //I get the error here 
dr["Style"] = dataGridView1.Rows[rowindex].Cells["Style"].Value; 
dr["BookingId"] = dataGridView1.Rows[rowindex].Cells["BookingId"].Value; 
1

この場合、Rowインデックスを取得する必要はありません。あなたが必要とするすべては、現在選択されている行であれば、あなたのコードは次のようになります...

var row = dataGridView1.SelectedRows[0]; 

dr["CustomerId"] = row.Cells["CustomerId"].Value; 

dr["Style"]  = row.Cells["Style"].Value; 

dr["BookingId"] = row.Cells["BookingId"].Value; 

これは言うまでもないが、行が実際に選択されていることを確認するために最初にチェックしてください...

また、選択したすべての行を反復処理したい場合は、あなたが使用することができます...

foreach(var row in dataGridView1.SelectedRows){ 
    //execute behaviour here... 
}