2011-08-06 4 views
0

これは私がここであなたにもたらす本当の挑戦です。できればそれを解決してください。カスタムDGVの不可能な作業Enterキーの次の制御にフォーカスを設定

Enter Key On Datagridview良いアイデアですか?または、ここにあるどんな体でも、次の条件でそれを動作させることは可能ですか?

Enterキーを押すと、Datagridview Controlは無用です。

私はカスタムDGVに続いています

public class MyDataGridView : DataGridView 
    { 
     protected override bool ProcessDialogKey(Keys keyData) 
     { 
      Keys key = (keyData & Keys.KeyCode); 
      if (key == Keys.Enter) 
      { 
       Tab(keyData); 
       return true; 
      } 
      return base.ProcessDialogKey(keyData); 
     } 
     protected override bool ProcessDataGridViewKey(KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 
       Tab(e.KeyData); 
       return true; 
      } 
      return base.ProcessDataGridViewKey(e); 
     } 
     private void Tab(Keys KeyData) 
     { 
      Point cca = CurrentCellAddress; 
      bool Forward = ((KeyData & Keys.Shift) != Keys.Shift); 
      if (Forward) 
       if (cca.Y == Rows.Count - 1)   // last row? 
        if (cca.X == Columns.Count - 1)  // last column? 
         ToNextControl(Forward); 
        else 
         ProcessTabKey(KeyData); 
       else 
        ProcessTabKey(KeyData); 
      else 
       if (cca.Y == 0)   // first row? 
        if (cca.X == 0)  // first column? 
         ToNextControl(Forward); 
        else 
         ProcessTabKey(KeyData); 
       else 
        ProcessTabKey(KeyData); 
     } 

     /// <summary> 
     /// Go to the next control, forward or backword. This does not support 
     /// wrapping from the first to the last or the last to the first. 
     /// </summary> 
     /// <param name="Forward">Whether to go forward</param> 
     private void ToNextControl(bool Forward) 
     { 
      Control c = Parent.GetNextControl(this, Forward); 
      while (c != null && !c.TabStop) // get next control that is a tabstop 
       c = Parent.GetNextControl(c, Forward); 
      if (c != null) 
       c.Select(); 
     } 
    } 

同じ作業を、通常の上でそれがキー入力を入力で次のコントロールにフォーカスが可能ですが、あなたはデータバインドされたモードにAllowUserToAddRows =偽を設定した場合、それが動作していません。最後の列のセルの値を編集してEnterキーを押すと、次のコントロールにフォーカスを設定できないという問題が発生します。

これを克服する方法は?どのように問題を解決するには?

答えて

1

私は、現在のコントロールにフォーカスイベントを追加することで、あなたに適したソリューションを見つけました。私はこれがあなたが望むものだと思っていますが、本当にあなたの質問を理解することはできませんでした。それが違うかどうか私に教えてください。 AllowUserToAddRows = falseまたはtrueで動作します。

private void ToNextControl(bool Forward) 
    { 
     Control c = Parent.GetNextControl(this, Forward);   
     while (c != null && !c.TabStop) // get next control that is a tabstop 
      c = Parent.GetNextControl(c, Forward); 
     if (c != null) 
     { 
      //c.Select(); // Not needed for it to work 
      c.Focus(); // force it to focus 
     } 
    } 
+0

はい私は本当にうまくいきます。しかし、なぜ私の場合にはうまくいかないのか教えてください。 – mahesh

+0

...私の古いコードによれば、なぜそれは動作しないのですか?なぜ焦点を絞る必要があるのか​​。 – mahesh

+0

ここで答えた:http://stackoverflow.com/questions/802722/whats-the-difference-between-control-select-and-control-focus – Moop

0

私はちょうどそれを実行せずに、コードを見て見ている問題は、このです:

ユーザーがDataGridViewの中の最後のコントロールに到達するとGetNextControlを返すためのコントロールがありません。

このケースを処理するロジックを追加したい場合があります。たとえば、ウィザードフォームの場合は、送信ボタンまたは次ボ​​タンにフォーカスを設定できます。

関連する問題