【问题标题】:How do I use Tab to move between properties of winform property grid如何使用 Tab 在 winform 属性网格的属性之间移动
【发布时间】:2016-07-15 16:21:11
【问题描述】:

我在我的项目中使用 Winform 的 PropertyGrid,一切正常,但选项卡顺序。

当我点击 Tab 时,我想切换到下一个属性,但事实上,选择从属性网格移到下一个控件。我无法弄清楚如何完成这项工作?

谢谢

【问题讨论】:

  • 唯一阻止我发布解决方案的是获取下一个可见项目的方法(从当前项目组之外)。在我看来,其他一切都很好。
  • 有一个商业解决方案可以很好地处理 Tab 键。它适合您吗?
  • 感谢 Nic,但我认为这不是一个选择。

标签: c# .net winforms propertygrid


【解决方案1】:

我们应该深入了解PropertyGrid 的内部部分,然后我们可以更改控件的默认Tab 行为。一开始我们应该创建一个派生的PropertyGrid 并覆盖它的ProcessTabKey 方法。

在方法中,首先找到Controls集合中索引2处的内部PropertyGridView控件。然后使用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);
    }
}

【讨论】:

  • 感谢您的回答 Reza,但不知何故,当我按 Tab 时 ProcessTabKey 没有被击中。
  • 可能你搞错了。您应该将此类添加到您的项目中,并将它的一个实例放在您的表单上。我对其进行了测试,我确定它可以正常工作,所以如果您在应用答案时遇到任何问题,请告诉我:)
  • 是的,Reza 这就是我所做的,可能是选项卡在其他地方处理并且不让 processTab 执行?我不知道处理 tab 键的顺序是什么,但有些东西正在阻止 tab 不传播
  • 最好在一个干净的表单/项目中测试它并让我知道结果:)
  • 很好的答案!对于其他人,如果你想处理 forward = false if (!forward &amp;&amp; index &gt; 0) { var previous = entries[index - 1]; previous.Select(); return true; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多