1

App.config を使用して、プロパティ グリッドでプロパティの可視性を設定できるようにしたいと考えています。私が試してみました :

[Browsable(bool.Parse(Sytem.Configuration.ConfigurationSettings.AppSettings["testBool"]))]

ただし、Visual Studio 2008 では、「属性引数は定数式、typeof 式、または属性パラメーター型の配列作成式である必要があります」というエラーが表示されます。App.config でこの bool を設定する方法はありますか?

4

3 に答える 3

2

config からこれを行うことはできません。ただし、カスタム コンポーネント モデルの実装を作成することで、属性を制御できます。つまり、独自の を作成し、またはをPropertyDescriptor使用して関連付けます。多くの作業。ICustomTypeDescriptorTypeDescriptionProvider


アップデート

私はそれを行う卑劣な方法を考えました。以下を参照してください。ここでは、実行時に文字列を使用して 2 つのプロパティにフィルターします。タイプを所有していない場合 ( を設定するため[TypeConverter])、次を使用できます。

TypeDescriptor.AddAttributes(typeof(Test),
    new TypeConverterAttribute(typeof(TestConverter)));

実行時にコンバーターを関連付けます。

using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System;
class TestConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, System.Attribute[] attributes)
    {
        PropertyDescriptorCollection orig = base.GetProperties(context, value, attributes);
        List<PropertyDescriptor> list = new List<PropertyDescriptor>(orig.Count);
        string propsToInclude = "Foo|Blop"; // from config
        foreach (string propName in propsToInclude.Split('|'))
        {
            PropertyDescriptor prop = orig.Find(propName, true);
            if (prop != null) list.Add(prop);
        }
        return new PropertyDescriptorCollection(list.ToArray());
    }
}
[TypeConverter(typeof(TestConverter))]
class Test
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Blop { get; set; }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Test test = new Test { Foo = "foo", Bar = "bar", Blop = "blop"};
        using (Form form = new Form())
        using (PropertyGrid grid = new PropertyGrid())
        {
            grid.Dock = DockStyle.Fill;
            form.Controls.Add(grid);
            grid.SelectedObject = test;
            Application.Run(form);
        }
    }
}
于 2009-08-10T23:25:25.967 に答える
2

app.config で上記のことを行うことはできません。これは設計時ベースであり、app.config は実行時に読み取られて使用されます。

于 2009-08-10T21:59:11.803 に答える
1

プロパティ グリッドはリフレクションを使用して、表示するプロパティとその表示方法を決定します。これは、どの種類の構成ファイルでも設定できません。この属性をクラス自体のプロパティに適用する必要があります。

于 2009-08-10T22:02:36.180 に答える