单击PropertyGrid中的属性文本框显示属性编辑器

时间:2017-05-10 12:11:48

标签: c# .net winforms propertygrid uitypeeditor

我在无键盘电脑上创建触控应用程序,我使用PropertyGrid管理类来存储/保存应用程序配置。 我需要使用我创建的自定义键盘(而不是系统)将类设置为UITypeEditor来编辑属性行的行 现在,单击右键时会显示自定义键盘。

是否可以显示行开始编辑时(如文本框Enter事件), 或者当选择行时?

1 个答案:

答案 0 :(得分:1)

您在PropertyGrid中看到的编辑器控件是一个GridViewEdit控件,它是PropertyGridView的孩子,是PropertyGrid的孩子。

您可以找到编辑控件并为其Enter事件分配事件处理程序。在这种情况下,您可以找到SelectedGridItem,然后调用其EditPropertyValue方法,该方法负责显示UITypeEditor

private void propertyGrid1_SelectedObjectsChanged(object sender, EventArgs e)
{
    var grid = propertyGrid1.Controls.Cast<Control>()
        .Where(x => x.GetType().Name == "PropertyGridView").FirstOrDefault();

    var edit = grid.Controls.Cast<Control>()
        .Where(x => x.GetType().Name == "GridViewEdit").FirstOrDefault();

    edit.Enter -= edit_Enter;
    edit.Enter += edit_Enter;
}

private void edit_Enter(object sender, EventArgs e)
{
    var item = this.propertyGrid1.SelectedGridItem;
    if (item.GetType().Name == "PropertyDescriptorGridEntry")
    {
        var method = item.GetType().GetMethod("EditPropertyValue",
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);

        var grid = propertyGrid1.Controls.Cast<Control>()
            .Where(x => x.GetType().Name == "PropertyGridView").FirstOrDefault();

        method.Invoke(item, new object[] { grid });
    }
}

注意:对于模态编辑器,Enter事件很烦人并且一遍又一遍地重复。为避免这种情况,您可以使用控件的Click事件。

另外,作为另一个选项,您可以依赖SelectedGridItemChanged PropertyGrid事件并检查是否e.NewSelection.GetType().Name == "PropertyDescriptorGridEntry"然后使用反射调用所选网格项的EditPropertyValue