1

プロパティグリッドに表示されるプロパティを含めたり除外したりする必要があるカスタムControlDesignerを作成しました。しかし、何らかの理由で、コードを無視しているように見えますか?何を間違えたのかわかりませんか?何かが足りないのでしょうか?VSなどを設定する必要がありますか?

また、私が見つけた例では、remove呼び出しがどこにあるべきかについて意見が一致していないようです。いくつかの例では、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

少し検索した後、私の質問の1つに対する答えが見つかりました。

「従うべき一般的なルールは、「PreFilter」メソッドで項目を追加または削除し、「PostFilter」メソッドで既存の項目を変更することです。常に、PreFilter メソッドで最初に基本メソッドを呼び出し、PostFilter メソッドで基本メソッドを最後に呼び出します.これにより、すべてのデザイナー クラスに変更を適用する適切な機会が与えられます。」

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

それでも、コードが機能しない理由がわかりません:(

于 2010-10-25T12:38:31.543 に答える