如何让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 namedefault optionsdescription 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 : 下拉框中的值:小米,小明。

PropertyGrid—添加EventTab

C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

C#中自定义propertygrid控件的属性,要求当点击不同的其他控件时,能在propertygrid控件中显示基本的信息

c#用propertyGrid控件