如何让PropertyGrid显示控件的Name属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让PropertyGrid显示控件的Name属性相关的知识,希望对你有一定的参考价值。
参考技术A 这是核心代码:class ControlDescriptionProvider : TypeDescriptionProvider
private static TypeDescriptionProvider defaultTypeProvider =
TypeDescriptor.GetProvider(typeof(Control));
public ControlDescriptionProvider() : base(defaultTypeProvider)
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
ICustomTypeDescriptor defaultDescriptor = base.GetTypeDescriptor(objectType, instance);
return new TitleCustomTypeDescriptor(defaultDescriptor);
class TitleCustomTypeDescriptor : CustomTypeDescriptor
public TitleCustomTypeDescriptor(ICustomTypeDescriptor parent)
: base(parent)
customFields.Add(new NamePropertyDescriptor());
private List<PropertyDescriptor> customFields = new List<PropertyDescriptor>();
public override PropertyDescriptorCollection GetProperties()
return new PropertyDescriptorCollection(base.GetProperties()
.Cast<PropertyDescriptor>().Union(customFields).ToArray());
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
return new PropertyDescriptorCollection(base.GetProperties(attributes)
.Cast<PropertyDescriptor>().Union(customFields).ToArray());
class NamePropertyDescriptor : PropertyDescriptor
public NamePropertyDescriptor() : base("(Name)", null)
public override bool CanResetValue(object component)
return false;
public override Type ComponentType
get
return typeof(Control);
public override object GetValue(object component)
Control control = (Control)component;
return control.Name;
public override bool IsReadOnly
get
return false;
public override Type PropertyType
get
return typeof(string);
public override void ResetValue(object component)
throw new NotImplementedException();
public override void SetValue(object component, object value)
Control control = (Control)component;
control.Name = value.ToString();
public override bool ShouldSerializeValue(object component)
return false;
下面是测试代码:
ControlDescriptionProvider provider = new ControlDescriptionProvider();
TypeDescriptor.AddProvider(provider, typeof(Control));
//下面测试下Label,任何控件都可以。
Label label = new Label();
label.Name = "123";
propertyGrid1.SelectedObject = label;本回答被提问者采纳 参考技术B Button btn=new Button();
btn.Name="MyName";
btn.Text="OK";
propertyGrid1.SelectedObject=btn;
在propertyGrid1控件上,会显示btn的Text属性会OK,但是不会显示Name属性,我希望把Name属性也要显示出来
因为我的SelectedObject在运行时可能是不同的控件,所以不能通过从Button派生出自己的自定义Button来实现
MFC PropertyGrid 控件在 Visual Studio 的对话框编辑器中如何工作?
【中文标题】MFC PropertyGrid 控件在 Visual Studio 的对话框编辑器中如何工作?【英文标题】:How does the MFC PropertyGrid control work in the dialog editor in visual studio? 【发布时间】:2020-08-25 15:01:31 【问题描述】:在 Visual Studio 对话框编辑器中,我可以将 MFC 属性网格控件添加到 dailog。我如何自定义其内容,并设置选项,例如允许用户在使用它的程序运行时编辑它的内容,或者我如何使用 c++ 更改它的内容? 当我添加按钮或编辑控件时,它会在程序运行时显示在对话框中,而当我添加 MFC 属性网格时,甚至不会显示 dailog。
这是 Visual Studio 对话框编辑器的图片,以及位于 dailog 中间的 MFC 属性控制网格,其中的内容我不知道如何更改。
【问题讨论】:
【参考方案1】:CMFCPropertyGridCtrl简单教程:
1.创建一个基于对话框的MFC项目,将CMFCPropertyGridCtrl拖入其中,并调整大小。然后将控件的 ID 更改为 IDC_MFCPROPERTYGRID_TEST,并使用 Add Varible 将变量 m_propertyGrid 添加到控件。将通知的设置更改为True
。
Description Rows Count refers
到下面描述部分中的行数。
Enable Description Area
表示是否开启以下描述功能。
Enable Header
表示是否启动header。
Mark Modified Properties
表示是否突出显示更改。
2.设置界面
在OnInitDialog()
中添加如下代码
HDITEM item;
item.cxy=120;
item.mask=HDI_WIDTH;
m_propertyGrid.GetHeaderCtrl().SetItem(0, new HDITEM(item));
-
添加内容
在OnInitDialog()
中添加如下代码
CMFCPropertyGridProperty* pProp2 = new CMFCPropertyGridProperty(
_T("choose"),
_T("select"),
_T(""));
pProp2->AddOption(_T("1"));
pProp2->AddOption(_T("2"));
pProp2->AddOption(_T("3"));
pProp2->AllowEdit(FALSE); //Editing of options is not allowed
m_propertyGrid.AddProperty(pProp2);
调用构造函数时传入的三个参数是item name
、default options
和description text
。
另外,您可以添加下拉菜单:
CMFCPropertyGridProperty* pProp2 = new CMFCPropertyGridProperty(
_T("choose"),
_T("select"),
_T(""));
pProp2->AddOption(_T("1"));
pProp2->AddOption(_T("2"));
pProp2->AddOption(_T("3"));
pProp2->AllowEdit(FALSE); //Editing of options is not allowed
m_propertyGrid.AddProperty(pProp2);
另外还有三个类似的项目:
CMFCPropertyGridColorProperty * pProp3 = new CMFCPropertyGridColorProperty(
_T("colour"), RGB(0, 111, 200));
m_propertyGrid.AddProperty(pProp3);
CMFCPropertyGridFileProperty * pProp4 = new CMFCPropertyGridFileProperty(
_T("open file"), TRUE, _T("D:\\test.txt"));
m_propertyGrid.AddProperty(pProp4);
LOGFONT font = NULL ;
CMFCPropertyGridFontProperty * pProp5 = new CMFCPropertyGridFontProperty(
_T("select font"), font);
m_propertyGrid.AddProperty(pProp5);
最后,这是最终的程序运行界面:
【讨论】:
它不会让我初始化 HCnd,当我尝试包含所需的标头时,它说找不到它。 能否提供MFC Property Grid控件的相关代码和属性设置?因为它有助于重现问题。以上是关于如何让PropertyGrid显示控件的Name属性的主要内容,如果未能解决你的问题,请参考以下文章
PropertyGrid 控件如何显示两层嵌套的动态 JSON 对象?
C# 属性控件(propertyGrid),如何动态添加下拉框中的值。例如:Name : 下拉框中的值:小米,小明。
C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)
C#中自定义propertygrid控件的属性,要求当点击不同的其他控件时,能在propertygrid控件中显示基本的信息