2016-07-15 2 views
2

Winform의 PropertyGrid을 사용하고 있습니다. 프로젝트에서는 모두 잘되지만 탭 순서는 잘 작동합니다.Tab을 사용하여 winform 속성 표의 속성 사이를 이동하려면 어떻게합니까?

을 눌렀을 때 다음 속성으로 전환하고 싶지만 infact가 선택되면 다음 컨트롤로 속성 격자 밖으로 이동합니다. 이 일을 처리하는 방법을 알아낼 수 없습니까? 우리는 PropertyGrid의 내부 부품에 파고해야

감사

+0

솔루션을 게시하지 못하게하는 유일한 방법은 (현재 항목 그룹 외부에서) 다음에 표시되는 항목을 가져 오는 방법입니다. 다른 모든 것은 내 편이 잘 보인다. – user3185569

+0

Tab 키를 잘 처리하는 상용 솔루션이 있습니다. 그것은 당신을위한 선택입니까? –

+0

감사합니다 닉,하지만 지금은 옵션이라고 생각하지 않습니다. – Muds

답변

3

는 우리가 기본 탭 컨트롤의 동작을 변경할 수 있습니다. 처음에는 파생 된 PropertyGrid을 만들고 ProcessTabKey 메서드를 재정의해야합니다.

이 방법에서는 먼저 컬렉션의 인덱스 2에있는 컨트롤 PropertyGridView 컨트롤을 찾습니다. 그런 다음 Reflection을 사용하여 모든 GridItem 요소를 포함하는 모음 인 해당 allGridEntries 필드를 가져옵니다.

모눈 항목을 모두 찾은 후 컬렉션에서 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