Мы должны выкопать во внутренние части PropertyGrid
, то мы можем изменить по умолчанию Tab поведение контроля. В начале мы должны создать производный 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);
}
}
Единственное, что мешает мне опубликовать решение, - это способ получить следующий видимый элемент (из-за пределов текущей группы элементов). Все остальное кажется прекрасным с моей стороны. – user3185569
Существует коммерческое решение, которое хорошо управляет клавишей Tab. Это вариант для вас? –
спасибо Nic, но я не думаю, что это вариант сейчас. – Muds