我制作了一个自定义ControlDesigner,我需要包含并排除属性网格中显示的属性。但出于某种原因,似乎只是忽略了代码?我不知道我可能做错了什么?我可以错过一些东西吗?我需要设置VS还是什么?
同样在示例中,我发现他们似乎不同意删除调用的位置。在某些示例中,他们在preFilterProperties方法中调用它,在某些示例中,他们在postFilterProperties()方法中调用它,这让我感到困惑。在某些示例中,它们在运行base.preFilterProperties()方法之后调用它,有时在之前?请有人澄清一下吗?
到目前为止,这是代码。我还想添加一个属性列表,该属性列表将被排除,但我不知道何时设置这样的属性,因为它似乎在运行时之前运行了反射?或者有什么方法可以实现这一目标吗?
using System.ComponentModel;
using System.Drawing.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.ComponentModel.Design;
using System;
using System.Collections;
using System.Collections.Generic;
namespace PropertyEditorProject
{
[Designer(typeof(YourClassDesigner))]
class MyPropertyClass
{
protected List<string> _MyList;
protected string _MyName;
protected string _MyCarModel;
protected int _MyAge;
public List<string> MyList
{
get
{
return _MyList;
}
set
{
_MyList = value;
}
}
public string MyName
{
get
{
return _MyName;
}
set
{
_MyName = value;
}
}
public string MyCarModel
{
get
{
return _MyCarModel;
}
set
{
_MyCarModel = value;
}
}
public int MyAge
{
get
{
return _MyAge;
}
set
{
_MyAge = value;
}
}
public MyPropertyClass()
{
_MyList = new List<string>();
_MyList.Add("Test");
_MyList.Add("Testing 2");
_MyName = "TestName";
_MyCarModel = "Subaru";
_MyAge = 20;
}
}
internal class YourClassDesigner : ControlDesigner
{
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
properties.Remove("MyAge");
base.PreFilterProperties(properties);
}
}
static class MainProgram
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Form form = new Form();
PropertyGrid grid = new PropertyGrid();
grid.Dock = DockStyle.Fill;
form.Controls.Add(grid);
grid.SelectedObject = new MyPropertyClass();
Application.Run(form);
}
}
}
有人有什么想法吗?感谢任何帮助
答案 0 :(得分:0)
经过一番搜索,我找到了一个问题的答案:
“要遵循的一般规则是在”PreFilter“方法中添加或删除项目,并修改”PostFilter“方法中的现有项目。始终先在PreFilter方法中调用基本方法,然后在最后调用基本方法PostFilter方法。这可以确保所有设计者类都有适当的机会来应用他们的更改。“
http://msdn.microsoft.com/en-us/library/ms973820.aspx
我仍然无法弄清楚为什么代码不起作用:(