我想在加载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中运行。
答案 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;