2016-12-07 1 views
0
  • DataGridViewの最後の列にユーザーがEnterキーを押したときに次の行にジャンプするにはどうすればよいですか?CのDataGridViewの最後の列にユーザーがデータを入力したときに新しい行を追加する方法

  • このコードはまた、私が解決する必要があり、エラー与える:

    インデックスが範囲外であるが非負と コレクションのサイズよりも小さくなければなりません。

    private void DataGridView1_KeyDown(object sender, KeyEventArgs e) 
    { 
        try 
        { 
         if (e.KeyCode == Keys.Enter) 
         { 
          e.SuppressKeyPress = true; 
          int iColumn = DataGridView1.CurrentCell.ColumnIndex; 
          int iRow = DataGridView1.CurrentCell.RowIndex; 
          if (iColumn >= DataGridView1.Columns.Count - 2) 
           DataGridView1.CurrentCell = DataGridView1[0, iRow + 1]; 
          else 
           DataGridView1.CurrentCell = DataGridView1[iColumn + 1, iRow]; 
         } 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(ex.Message.ToString()) 
        } 
    } 
    
+0

エラーはどの行に表示されますか?どのくらい次の行を追加していますか? – krillgar

+1

最後の行であるため、次の行はありません。最後の行が選択されている場合、最初から開始することができます。本当に次の行が必要な場合は、最初に行を追加します。 – Ethan

+0

最後の列がヒットしたときに@krillgarエラーがスローされます。 – Patrick

答えて

0

あなたはDataGridView.KeyDownを使用してこれを処理できますが、ユーザーがセルの編集中を入力当たるケースを見逃すことでしょう。すべてのケースをキャッチするには、DataGridViewから独自のクラスを派生させ、ProcessCmdKeyを上書きします。上記のコメントに示唆されているロジックを使用して、と入力した場合、最後の行についてが検出された場合は、別の行を追加します。手動でCurrentCellを変更する心配はありません。基本クラスでその作業自体を処理させます。

public class MyDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     bool enterKeyDetected = keyData == Keys.Enter; 
     bool isLastRow = this.CurrentCell.RowIndex == this.RowCount - 1; 

     if (enterKeyDetected && isLastRow) 
     { 
      Console.WriteLine("Enter detected on {0},{1}", this.CurrentCell.RowIndex, this.CurrentCell.ColumnIndex); 

      // Add the new row. 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

あなただけがあなたのDataSourceに応じて、新しい行を追加する方法に注意を払う必要があります。

  • なし

    this.Rows.Add(); 
    
  • DataTable

    DataTable dt = (DataTable)this.DataSource; 
    dt.Rows.Add(); 
    
  • BindingList<T>List vs BindingListを参照)

    BindingList<T> bl= (BindingList<T>)this.DataSource; 
    bl.Add(new T()); 
    

最後には、ちょうどこのカスタムいずれかのインスタンスでDataGridViewのインスタンスを置き換えます。


あなたはDataSourceを持っていない場合は、ちょうどDataGridView.AllowUserToAddRows = trueを設定することNewRowを追加する別の引き金となりますので、編集十分である、と述べているすべて。

関連する問題