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

Winforms WinForm PropertyGrid帮助区域中的更改文本,winforms,propertygrid,Winforms,Propertygrid,我想在加载PropertyGrid后更改WinForm PropertyGrid中帮助区域中的文本。下面是我使用反射的两次尝试,但它们都不能正常工作 解决方案1:我继承了PropertyGrid并检索doccomment,它是帮助区域的控件。我有一个单独的按钮,它调用ChangeHelpText方法来更改doccomment的文本属性。之后,我调用PropertyGrid的刷新方法。然而,一切都没有改变。此外,我还为PropertyGrid指定了HelpBackColor,但并没有任何更改。有什

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

解决方案1:我继承了PropertyGrid并检索doccomment,它是帮助区域的控件。我有一个单独的按钮,它调用ChangeHelpText方法来更改doccomment的文本属性。之后,我调用PropertyGrid的刷新方法。然而,一切都没有改变。此外,我还为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私有字段更改为我的文本。有趣的是,如果我在重新分配DescriptionAttribute的位置设置一个断点,则此解决方案部分起作用,因为只有一些属性的DescriptionAttribute发生了更改并反映在PropertyGrid中,而其他属性没有更改。如果不设置断点,则不会更改任何内容。所有内容都在STAThread中运行。

第一个解决方案不起作用,因为您正在设置控件的
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;