Reflection и пользовательский ControlDesigner не работают в c # - PullRequest
1 голос
/ 25 октября 2010

Я создал собственный 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 голосов
/ 25 октября 2010

После небольшого поиска я нашел ответ на один из моих вопросов:

"Общее правило, которое необходимо соблюдать, заключается в добавлении или удалении элементов в методах" PreFilter "и изменении существующих элементов в методах" PostFilter ". Всегда сначала вызывайте базовый метод в методах PreFilter и вызывайте базовый метод последним в методы PostFilter. Это гарантирует, что всем классам дизайнеров будет предоставлена ​​надлежащая возможность применить свои изменения. "

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

Тем не менее я не могу понять, почему код не будет работать, хотя: (

...