2017-04-20 4 views
1

私は奇妙な問題があります。 WinFormsアプリでは、私は、コードが正常に動作しますが、私は、問題が移動する機能を実装して抱えている私は、矢印キーでそれの内側に移動するためのいくつかのコードを実装するDataGridViewを持っており、キーを入力してください...Datagridview内で押されたTabのコードからwinformsの次のコントロールを選択する方法

class CalibDataGridView : System.Windows.Forms.DataGridView 
    { 
     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 
      int row = 0; 
      int col = 0; 
      // return base.ProcessCmdKey(ref msg, keyData); 
      switch (keyData) 
      { 
       case Keys.Down: 
        return true; 
       case Keys.Up: 
        return true; 

       case Keys.Right: 
        row = this.CurrentCell.RowIndex; 
        col = this.CurrentCell.ColumnIndex; 

        while (true) 
        { 
         col++; 
         if (col == this.Columns.Count) 
         { 
          row++; 
          col = 0; 
         } 

         if (row == this.Rows.Count) 
         { 
          col = 0; 
          row = 0; 
         } 

         if (!this[col, row].ReadOnly && this[col, row].Visible) break; 
        } 

        this.CurrentCell = this[col, row]; 

        return true; 

       case Keys.Left: 
        row = this.CurrentCell.RowIndex; 
        col = this.CurrentCell.ColumnIndex; 

        while (true) 
        { 
         col--; 
         if (col < 0) 
         { 
          row--; 
          col = this.Columns.Count - 1; 
         } 

         if (row < 0) 
         { 
          row = this.Rows.Count - 1; 
          col = this.Columns.Count - 1; 
         } 

         if (!this[col, row].ReadOnly && this[col, row].Visible) break; 
        } 

        this.CurrentCell = this[col, row]; 

        return true; 

       case Keys.Enter: 
        row = this.CurrentCell.RowIndex; 
        col = this.CurrentCell.ColumnIndex; 

        while (true) 
        { 

          row++; 
         if (row == this.Rows.Count) 
         { 
          row = 0; 
         } 

         if (!this[col, row].ReadOnly && this[col, row].Visible) break; 
        } 

        this.CurrentCell = this[col, row]; 

        return true; 

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

TABキーが押されたときの次の制御。私はDataGridViewののPreviewKeyDown機能にいくつかのコードを追加:

private void dgvRepeatability1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
     { 
      if (e.KeyCode == Keys.PageDown && tbcMain.SelectedIndex > 0) 
      { 
       tbcMain.SelectedIndex--; //changes tab page 
      } 
      else if (e.KeyCode == Keys.PageUp && tbcMain.SelectedIndex < 7) 
      { 

       tbcMain.SelectedIndex++; 
      } 
      else if (e.KeyCode == Keys.Tab) //does not work like it should!!!! 
      { 
       Console.Beep(1000, 200); 
       this.SelectNextControl((Control)sender, true, true, true, true); 

      } 
     } 

をこの最後のコードは奇妙な方法で動作します...どこかにそれはそう(それはビープ音を鳴らし必要があり、次の制御変更の背景色のような背景の変化に焦点が合って、それを契機に私はそれが焦点を当てていることがわかります)しかし、私は全体のフォームに焦点を失う...私はTabキーまたは矢印キーまたは他のキーを押すことができます何も起こりません....

私はフォームを最小化し、もう一度フォーカスを移動すると、最初のように次のコントロールに移動します。

また、.Select()と.Focus()でフォーカスを変更しても動作しませんでした。

ありがとうございました!

答えて

1

あなたはSelectNextControlを使用することができます。

private void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Tab) 
    { 
     e.Handled = true; 
     this.SelectNextControl((Control)sender, true, true, true, true); 
    } 

あなたはまた、次のコントロールを自分で見つけることができます:

private void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Tab) 
    { 
     e.Handled = true; 
     var dataGrid = (DataGridView) sender; 
     var tabIndex = dataGrid.TabIndex; 
     var controls = this.Controls.Cast<Control>().Where(r => r.TabIndex > tabIndex); 
     if (controls.Any()) 
     { 
      controls.OrderBy(r => r.TabIndex).First().Select(); 
     } 
     else 
     { 
      this.Controls.Cast<Control>() 
         .Where(r => r.TabIndex <= tabIndex) 
         .OrderBy(r => tabIndex) 
         .First() 
         .Select(); 
     } 
    } 
} 
+0

感謝を!それは実際に働いた。私は単にそれを変更することができます: e.Handled = true; this.SelectNextControl((Control)送信者、true、true、true、true); 問題はPreviewKeyDown機能にあったと思う... – Pajkec

+0

ああ、それは私のために働くようには見えなかったが、私はあなたのためにやってうれしい。私は未来の読者のために私の答えを編集します – EpicKip

+0

@Pajkecああ。それをテストし、私のために働くには、私はちょうど1価値false haha​​を持っていたので、私は愚かなように感じます。 – EpicKip

関連する問題