2017-02-01 14 views
0

Windowsフォームでは、データ処理を処理するための3つの列と少数のボタンを備えたグリッドビューがあります。グリッドは編集可能で、編集モードでユーザーが「Enter」キーを押すたびに、現在の行の次のセルにフォーカスを移動するために、以下のコードを使用しています。ボタンクリックしないクリックしないCellEndEditのDataGridViewでフォーカスが次のセルに設定されている場合

private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex != dataGridView.Columns.Count - 1) 
     { 
      this.BeginInvoke(new MethodInvoker(() => 
      { 
       dataGridView.CurrentCell = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex + 1]; 
      })); 
     } 
    } 

コードは正常に動作し、必要に応じてフォーカスを次のセルに移動しています。しかし、問題は、グリッドのセルがフォーカスされている間にボタンをクリックすると発生します。フォーカスが特定のセルにあるので、ボタンをクリックすると、CellEndEditイベントが発生します。ボタンをクリックすると、ボタンのイベントが発生し、コードの結果、次のセルにフォーカスが移動し、ボタンのクリックがまったく発生しません。 CellEndEdit関数の次のセルに移動するように記述されたコードがボタンをクリックしたときに起きないようにしたい。

  1. 編集のGridViewのセル、次のセルに移動し焦点を当て、Enterキーを押す - 次のセルにフォーカスが移動、いずれかのボタンをクリックして、正しい
  2. 編集のGridViewで呼び出しは、ボタンのクリックイベントは発生しません - 問題

私はこの問題に関してSOとインターネットで多くを検索しましたが、永続的な解決策を見つけることができませんでした。どんな助けでも大歓迎です。

+0

を私は非常にあなたを理解していません'CellBeginEdit'では' CellEndEdit'の値が同じであれば、次のセルに移動しないでください。 – Pikoh

+0

問題は次のセルに移動することではなく、問題はフォーム上の任意のボタンをクリックすると、gridviewがCellEndEditを起動し、コードが次のセルに移動します。ボタンのクリックはまったく実行されません。私は今私の質問に詳細を追加しました。 – Nitesh

答えて

1

オーバーライドProcessCmdKey

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == Keys.Enter && this.dataGridView.IsCurrentCellInEditMode) 
    { 
     if (this.dataGridView.CurrentCell.ColumnIndex != this.dataGridView.Columns.Count - 1) 
     { 
      //this.BeginInvoke(new MethodInvoker(() => 
      //{ 
       this.dataGridView.CurrentCell = this.dataGridView.CurrentRow.Cells[this.dataGridView.CurrentCell.ColumnIndex + 1]; 
      //})); 
     } 
     return true; 
    } 
    else return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

魅力のように動作します!ありがとう、トン! – Nitesh

2

代わりにKeyDownイベントを使用できます。

それはこのようなことができます:CurrentCellが編集モードであるとEnterがクリックされたかどうかを確認、form

private void dataGridView_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == Keys.Enter) 
    { 
     // the rest of your code 

     e.Handled = true; 
    } 
} 
+0

セルが編集モードのときにEnterキーを押すと、KeyDownイベントが発生しません。セルが編集モードでない場合にのみ起動されます。 – Nitesh

+1

私の他の答えを見てください –

関連する問題