1

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

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

4

1 回答 1

0

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

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

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

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

于 2010-10-25T12:38:31.543 回答