2017-04-11 36 views
2

私はdatagridviewでプログラミングをしようとしています。どのような結果が私は欲しいです:これは、次の列(テキストボックス列)に表示する必要があります:datagridview(コンボボックス列)の最初の列をクリックすると、データベースからの値が表示されます。formloadでdatagridviewエラーが発生しました:インデックスが範囲外の例外

私はこの例外を取得しています:

インデックスが範囲外でした。この行で

非負でなければなりません:

DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[0]; 

e.RowIndexは示し-1の値。

今、私はこのコードに悩まされています。何が問題なのか。誰でも助けてくれますか?

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     dataGridView1.CellValueChanged += 
     new DataGridViewCellEventHandler(dataGridView1_CellValueChanged); 
     dataGridView1.CurrentCellDirtyStateChanged += 
      new EventHandler(dataGridView1_CurrentCellDirtyStateChanged); 
    } 

    private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
    { 
     if (this.dataGridView1.IsCurrentCellDirty) 
     { 
      // This fires the cell value changed handler below 
      dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
     } 
    } 

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 

     DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[0]; 

     // ******** e.rowindex shows -1 value. 

     if (cb.Value != null) 
     { 

      con.Open(); 
      SqlCommand cmd = new SqlCommand("select rate FROM Ratemaster where Packagetype = '" + comboBox1.Text + 
       "' AND Tickettype ='" + ComboboxColumn.Selected + "' ", con); 


      SqlDataReader dr = cmd.ExecuteReader(); 

      if (dr.Read()) 
      { 
       dataGridView1.Rows[0].Cells[1].Value = dr[0].ToString(); 
       //dataGridView1.Rows[e.RowIndex].Cells[1].Value = "hi"; 
      } 
      else 
      { 
       //txtRate.Text = "0"; 
      } 



      con.Close(); 

     } 
    } 

答えて

2

-1の範囲を捕まえて無視するラッパーを使用してこの問題を解決しました。

if(e.RowIndex >= 0) 
    foo(); 
else 
    bar(); 

そして:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 


if(e.RowIndex >= 0) 
{ 
    DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[0]; 

    // ******** e.rowindex shows -1 value. 

    if (cb.Value != null) 
    { 

     con.Open(); 
     SqlCommand cmd = new SqlCommand("select rate FROM Ratemaster where Packagetype = '" + comboBox1.Text + 
      "' AND Tickettype ='" + ComboboxColumn.Selected + "' ", con); 


     SqlDataReader dr = cmd.ExecuteReader(); 

     if (dr.Read()) 
     { 
      dataGridView1.Rows[0].Cells[1].Value = dr[0].ToString(); 
      //dataGridView1.Rows[e.RowIndex].Cells[1].Value = "hi"; 
     } 
     else 
     { 
      //txtRate.Text = "0"; 
     } 



     con.Close(); 
    } 
    } 
+0

あなたの提案のお友達に感謝します。しかし、私はfoo()とbar()によって何を意味するのか分からなかった。私がプログラミングに新しいので、私は完全に理解できませんでした。あなたはあなたの答えを精緻化できますか? –

+3

こんにちは、fooとbar、特に連結された単語foobarはあなたが想像できるコードの共通のプレースホルダです。私はあなたが自分のコードでif節に反応し、elseパスを無視するべきだと表現したいと思います。ですから、あなたはそういうことをします: – kurdy

+2

@ V.Vaibhav多くの時間、プログラマーは例を示すために 'foo'と' bar'または 'foobar'という言葉を使います。上記は基本的に 'if(e.RowIndex> = 0)'として何かを行います。 '' foo(); 'が何か(あなたのコードで何をしたいのか、' 'foo()'を置き換えてください。同じことがコードのelse部分にも当てはまります。 –

0

代わりにdataGridView1_EditingControlShowing(IN 'CellValueChanged' イベントを割り当てる)、デザインビューからイベントを割り当てることを試みます。プロパティウィンドウを使用します。

「CellValueChanged」イベントがスタックされて何度も呼び出されているようです。つまり、EditingControlShowing()が最初にトリガされたときにCellValueChangedが次に呼び出されたときに、 。

+0

この解決策はエラーを解決する私のコードは、コンボボックスの列の隣にあるテキストボックスの列に値を表示することができません。列は空白のままです。どうすれば修正できますか?手伝って頂けますか ? –

2

@ kuryの答えは正しいものの、ANYセルの値が変更されたときにこれが実行されるという事実は見当たりません。これが正しく動作するためには、値が変更されたことを実際にコンボボックスのセルにする必要があります。 COMBO BOXの値が変更されたことを確認するにはもう一度チェックが必要です:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { 

    if (e.RowIndex >= 0) { 
    if (e.ColumnIndex == 0) { 
     DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[0]; 
     //..... 
     //..... 
    } 
    } 
} 
+1

それは本当です。実際に変更がある場合は、DataGridViewCellEventArgs eをチェックすることもできます。(少なくともWPFではこれが機能します) – kurdy

+0

@kurdyイベント名は、セル値DIDが変更されたという事実を示しています。だから、それはどのセルであるかを確認するだけです。ありがとう@JohnG。 – JohnG

+0

私はあなたに1つの質問をお聞きしたい。このソリューションはエラーを解決するために働いたが、私のコードは、コンボボックスの列の隣にあるテキストボックスの列に値を表示することができません。どうすれば修正できますか? –

関連する問題