3

選択したオブジェクトのプロパティの値が異なる場合、プロパティの表示値をカスタマイズできますか?

グリッドのデフォルトの動作では、選択したすべてのオブジェクトが同じ値を持つ場合に値が表示されますが、異なる場合はフィールドが空白になります。それらがどのように異なるかを知る方法はありません。

たとえば、次のクラスとコードが与えられた場合、次のようなものを表示するようにインスペクターとクラスを構成することは可能ですか (整数値の範囲、その他の値の倍数)。

TestLong|[50 - 60]
 TestInt|10
TestEnum|[Multiple] 

つまり、値が異なる場合、それらがどのように異なるかを示す何かが表示されますが、それらがすべて同じである場合、その値が表示されますか?

public enum TestEnum
{
    EnumVal1,
    EnumVal2,
    EnumVal3
}

public class TestClass
{
    public long TestLong { get; set; }
    public int TestInt { get; set; }
    public TestEnum TestEnum { get; set; }
}

    ...
control.SelectedObjects = new []
{
    new TestClass 
    { 
        TestLong = 50, 
        TestInt = 10, 
        TestEnum = TestEnum.EnumVal1 
    },
    new TestClass 
    { 
        TestLong = 60, 
        TestInt = 10, 
        TestEnum = TestEnum.EnumVal3
    },
}
    ...
4

2 に答える 2

2

PropertyGrid 全般はTypeConverters (暗黙のものを含む) を使用して値を表示するため、表示を変更できないと思いますが、複数選択の場合は使用されません。

あなたができることですが、それは正確な答えではありません.グリッドが複数選択モードの場合、次のようにカスタムUITypeEditorを提案することです:

    public class TestClass
    {
        // decorate the property with a custom UITypeEditor
        [Editor(typeof(MyMultiSelectionEditor), typeof(UITypeEditor))]
        public long TestLong { get; set; }
        public int TestInt { get; set; }
        public TestEnum TestEnum { get; set; }
    }

    public class MyMultiSelectionEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            // adapt to your need
            if (!IsPropertyGridInMultiView(context))
                return UITypeEditorEditStyle.None;

            return UITypeEditorEditStyle.Modal;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            if (IsPropertyGridInMultiView(context))
            {
                // multi view, show my custom stuff
                MessageBox.Show("hello from multi selection");
            }
            return base.EditValue(context, provider, value);
        }

        // gets a PropertyGrid instance from the context, if any
        private static PropertyGrid GetPropertyGrid(ITypeDescriptorContext context)
        {
            IServiceProvider sp = context as IServiceProvider;
            if (sp == null)
                return null;

            Control view = sp.GetService(typeof(IWindowsFormsEditorService)) as Control;
            if (view == null)
                return null;

            return view.Parent as PropertyGrid;
        }

        // determines if there is a PropertyGrid in the context, and if it's selection is multiple
        private static bool IsPropertyGridInMultiView(ITypeDescriptorContext context)
        {
            PropertyGrid pg = GetPropertyGrid(context);
            if (pg == null)
                return false;

            return pg.SelectedObjects != null && pg.SelectedObjects.Length > 1;
        }
    }
于 2013-03-22T10:14:14.233 に答える