反射和自定义ControlDesigner似乎不适用于c#

时间:2010-10-25 10:58:15

标签: c# properties propertygrid custom-attributes system.reflection

我制作了一个自定义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);
        }
    }
}

有人有什么想法吗?感谢任何帮助

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我找到了一个问题的答案:

“要遵循的一般规则是在”PreFilter“方法中添加或删除项目,并修改”PostFilter“方法中的现有项目。始终先在PreFilter方法中调用基本方法,然后在最后调用基本方法PostFilter方法。这可以确保所有设计者类都有适当的机会来应用他们的更改。“

http://msdn.microsoft.com/en-us/library/ms973820.aspx

我仍然无法弄清楚为什么代码不起作用:(