如何使用 Tab 在 winform 属性 网格的属性之间移动
How do I use Tab to move between properties of winform property grid
我在我的项目中使用 Winform 的 PropertyGrid
,一切正常,但 Tab 键顺序。
我想在点击 Tab 时切换到下一个 属性,但实际上,选择从 属性 网格移到下一个控件。我不知道如何完成这项工作?
谢谢
我们应该深入研究 PropertyGrid
的内部部分,然后我们可以更改控件的默认 Tab 行为。一开始我们应该创建一个派生的 PropertyGrid
并覆盖它的 ProcessTabKey
方法。
在方法中,首先找到内部的PropertyGridView
control which is at index 2 in Controls
collection. Then using Reflection
get its allGridEntries
field which is a collection containing all GridItem
个元素。
找到所有网格项目后,找到项目的SelectedGridItem
in the collection and check if it's not the last item, get the next item by index and select it using 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);
}
}
我在我的项目中使用 Winform 的 PropertyGrid
,一切正常,但 Tab 键顺序。
我想在点击 Tab 时切换到下一个 属性,但实际上,选择从 属性 网格移到下一个控件。我不知道如何完成这项工作?
谢谢
我们应该深入研究 PropertyGrid
的内部部分,然后我们可以更改控件的默认 Tab 行为。一开始我们应该创建一个派生的 PropertyGrid
并覆盖它的 ProcessTabKey
方法。
在方法中,首先找到内部的PropertyGridView
control which is at index 2 in Controls
collection. Then using Reflection
get its allGridEntries
field which is a collection containing all GridItem
个元素。
找到所有网格项目后,找到项目的SelectedGridItem
in the collection and check if it's not the last item, get the next item by index and select it using 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);
}
}