WinForm PropertyGrid更改帮助区域中的文本

时间:2015-02-10 10:22:36

标签: winforms propertygrid

我想在加载PropertyGrid后更改WinForm PropertyGrid中帮助区域中的文本。这是我尝试使用反射的两次尝试,但它们都无法正常工作。

解决方案1 ​​:我继承了PropertyGrid并检索了doccomment,它是帮助区域的控件。我有一个单独的按钮,调用ChangeHelpText方法来更改doccomment的文本属性。然后,我调用PropertyGrid的Refresh方法。然而,没有任何改变。我也分配了PropertyGrid的HelpBackColor,也没有任何变化。有什么想法吗?

public void ChangeHelpText(String desc)
{
    FieldInfo fi = this.GetType().BaseType.GetField("doccomment", BindingFlags.NonPublic | BindingFlags.Instance);
    Control dc = fi.GetValue(this) as Control;
    dc.Text = desc;
    dc.BackColor = Color.AliceBlue;
    fi.SetValue(this, dc);
}   

解决方案2 :PropertyGrid的帮助文本反映了绑定类中属性的DescriptionAttribute。因此,我使用TypeDescriptor.GetProperties来检索PropertyGrid的SelectedObject的所有属性,循环它们并检索DescriptionAttribute,并使用反射将DescriptionAttribute的description private字段更改为我的文本。有趣的是,如果我在一个断点处重新分配DescriptionAttribute,则此解决方案部分工作,因为只有一些属性的DescriptionAttribute被更改并反映在PropertyGrid中,而其他属性不会更改。如果我没有设置断点,则不会改变任何内容。一切都在STAThread中运行。

1 个答案:

答案 0 :(得分:1)

第一个解决方案不起作用,因为您正在设置控件的Text属性,该属性不用于显示帮助文本。 DocComment控件有两个标签子控件,用于显示帮助标题(属性标签)和帮助文本(属性描述属性值)。如果要更改帮助文本,则需要操作这两个标签。

只需调用更新这两个控件的方法就更简单了。下面给出的示例代码可以工作,但使用反射来调用方法。

public class CustomPropertyGrid : PropertyGrid
{
    Control docComment = null;
    Type docCommentType = null;

    public void SetHelpText(string title, string helpText)
    {
        if (docComment == null)
        {
            foreach (Control control in this.Controls)
            {
                Type controlType = control.GetType();
                if (controlType.Name == "DocComment")
                {
                    docComment = control;
                    docCommentType = controlType;
                }
            }
        }
        BindingFlags aFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
        MethodInfo aInfo = docCommentType.GetMethod("SetComment", aFlags);
        if (aInfo != null)
        {
            aInfo.Invoke(docComment, new object[] { title, helpText });
        }
    }
}

要更改背面颜色和前部颜色,请使用PropertyGrid提供的属性。

propertyGrid1.HelpBackColor = Color.BlueViolet;
propertyGrid1.HelpForeColor = Color.Yellow;