2016-07-15 12 views
2

私のプロジェクトでWinformのPropertyGridを使用していますが、すべてうまく動作しますがタブの順序です。タブを使用してwinformプロパティグリッドのプロパティ間を移動する方法

私はのタブを押したにもかかわらず、次のプロパティに切り替える必要がありますが、選択がプロパティグリッドから次のコントロールに移動します。私はこれをどうやってやるのか把握できないのですか?

おかげ

+0

私が解決策を投稿するのを止める唯一のことは、次の表示項目(現在の項目群外)を取得する方法です。他のすべては私の側からうまくいくようです。 – user3185569

+0

Tabキーをうまく処理する商用ソリューションがあります。それはあなたのための選択肢ですか? –

+0

Nicに感謝しますが、私はそれが今の選択肢ではないと思います。 – Muds

答えて

3

我々は、我々がコントロールのデフォルトタブ動作を変更することができPropertyGridの内部部品に掘る必要があります。始めに派生したPropertyGridを作成し、そのProcessTabKeyメソッドをオーバーライドする必要があります。

この方法では、まずPropertyGridViewコントロールがインデックス2にあるControlsコレクション内にあります。その後、Reflectionを使用して、そのallGridEntriesフィールドを取得します。このフィールドは、すべてGridItem要素を含むコレクションです。すべてのグリッドのアイテムを見つけた後

、コレクション内のSelectedGridItemのインデックスを見つけて、それが最後の項目ではありませんかどうかを確認し、インデックスで次の項目を取得し、アイテムのSelect方法を使用してそれを選択します。

using System.Collections; 
using System.Linq; 
using System.Windows.Forms; 
public class ExPropertyGrid : PropertyGrid 
{ 
    protected override bool ProcessTabKey(bool forward) 
    { 
     var grid = this.Controls[2]; 
     var field = grid.GetType().GetField("allGridEntries", 
      System.Reflection.BindingFlags.NonPublic | 
      System.Reflection.BindingFlags.Instance); 
     var entries = (field.GetValue(grid) as IEnumerable).Cast<GridItem>().ToList(); 
     var index = entries.IndexOf(this.SelectedGridItem); 

     if (forward && index < entries.Count - 1) 
     { 
      var next = entries[index + 1]; 
      next.Select(); 
      return true; 
     } 
     return base.ProcessTabKey(forward); 
    } 
} 
+0

あなたの答えはRezaに感謝しますが、Tabを押すと何とかProcessTabKeyがヒットしません。 – Muds

+0

おそらくあなたは間違いをしています。このクラスをプロジェクトに追加し、そのインスタンスをフォームに配置する必要があります。私はそれをテストし、私はそれが正常に動作すると確信しているので、あなたが答えを適用する問題を抱えている場合はお知らせください:) –

+0

ええRezaそれは私がやったこと、タブがどこかで処理されprocessTabを実行させませんか?私はタブキーを処理する順序は何か分かりませんが、何かがプロポゲートしないようにタブを止めています – Muds

関連する問題