2016-10-30 102 views
0

私は今、私の問題(私は古い質問を削除)に行くいくつかのコードを持っているので、この質問を再請求しています。DataGridView TextBoxセル編集、変更Enterキーのように動作するキー

基本的に、テキストボックスセルの編集中にEnterキーを押すと、Tabキー(次の行の同じ列の代わりに現在の行の次の列)のように機能します。

私の問題は、これまでに試したことのほとんどがうまくいきませんでしたが、これは私の現在試みられている解決策でした。

このコードは、編集/選択中のセルを変更することになっています。

private void PreTranslateDGV_KeyPressEvent(object sender, KeyEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender; 
     //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown) 
     MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView; 
     if (e.KeyCode == Keys.Enter) 
     { 
      e.SuppressKeyPress = true; 
      int newRow; 
      int newColumn; 
      if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)   // it's a last column, move to next row; 
      { 
       newRow = s.CurrentCell.RowIndex + 1; 
       newColumn = 0; 

       if (newRow == s.RowCount) 
        return; // ADD new row or RETURN (depends of your purposes..) 
      } 
      else    // just change current column. row is same 
      { 
       newRow = s.CurrentCell.RowIndex; 
       newColumn = s.CurrentCell.ColumnIndex + 1; 
      } 

      s.CurrentCell = s.Rows[newRow].Cells[newColumn]; 
     } 
    } 

これは

private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control; 
     tb.KeyDown += new KeyEventHandler (PreTranslateDGV_KeyPressEvent); 
    } 

セルのテキストボックスに上記のイベントを追加したコードであるこのの大半は、私はそれがしばらくの間、働いて取得しようとしてきたように私はStackOverflowのから見つかったコードでした。

誰かが正しい方法を知っている場合は、データグリッドビューから「Enter」キー押しを取得してください。セルを編集中に助けてください。

PS:MSDNフォーラムで読む(リンクが失われています)テキストボックスセルを編集するときにEnterキーを押すと編集が中止されます。上記のコードがなぜEnterキーで起動しないのかを説明しますが、それ以外の場合は起動します。

は、私は今の上に乗って、

class MyDataGridView : KryptonDataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if ((keyData == Keys.Enter) && (this.EditingControl != null)) 
     { 
      return false; 
     } 
     //for the rest of the keys, proceed as normal 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

しかし、関係なく、私は返すように見えるものを、入力していないキーがKeyPressEventに渡されていないprocesscmdkeyこれをすることによって行うことをしようとしています。

答えて

0

多くの後、迷惑なトラブル。ここで私が現在使用している解決策:

private void PreTranslateDGV_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender; 
     //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown) 
     MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView; 
     if (e.KeyCode == Keys.Enter) 
     { 
      int newRow; 
      int newColumn; 
      if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)   // it's a last column, move to next row; 
      { 
       newRow = s.CurrentCell.RowIndex + 1; 
       newColumn = 0; 

       if (newRow == s.RowCount) 
        s.Rows.Add(1); // ADD new row or RETURN (depends of your purposes..) 
      } 
      else    // just change current column. row is same 
      { 
       newRow = s.CurrentCell.RowIndex; 
       newColumn = s.CurrentCell.ColumnIndex + 1; 
      } 
      s.CurrentCell = s.Rows[newRow].Cells[newColumn]; 
     } 
    } 
    private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control; 
     tb.PreviewKeyDown -= PreTranslateDGV_PreviewKeyDown; 
     tb.PreviewKeyDown += PreTranslateDGV_PreviewKeyDown; 

     //e.Control.KeyDown += new KeyEventHandler(PreTranslateDGV_KeyPressEvent); 
    } 

私は、PreviewKeyDownイベントにKeyPressEventを変更しました。 ProcessCmdKeyが入力を取得する前に起動します。これと私の変更されたdatagridviewを使って、私はセルの中でTabのようなActにEnterキーを得ることができました。

class MyDataGridView : KryptonDataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if ((keyData == Keys.Enter) && (this.EditingControl != null)) 
     { 
      return true; 
     } 
     //for the rest of the keys, proceed as normal 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

ProcessCmdKeyにEnterキーが与えられた場合、処理されたことを示す「true」を即座に返します。 PreviewkeyDownイベントで持っているもの

これは他の人に役立つことを望みます。私はこれを行うにはいくつ他の方法があるかわからないが、この方法は私のために働いた。

関連する問題