1

私はこれをアプリケーションで見ましたが、C#を使用してWinFormでこれを実行できるかどうか疑問に思っています。私はPropertyGridコントロールをカスタマイズした経験がないので、コードについて親切に助けていただければ幸いです。前もって感謝します。

Sceenshot:

ここに画像の説明を入力してください

4

1 に答える 1

2

それを達成するためのいくつかのステップがあります。

1.値の列挙型を定義します。

public enum TypeCodes
{
    Baking,
    Barbecuing,
    Blanching,
    Blind_Baking,
    Boiling,
    Broiling,
    Deep_Frying,
}

2.タイプListのプロパティを使用してクラスを作成します。

using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;

namespace PropertyGrid_ListBox_Test
{
    class TestCase
    {
        public TestCase()
        {
            Manufacturer = new List<TypeCodes>();
        }

        [DisplayName("Manufacturer Preparation Type Code")]
        public List<TypeCodes> Manufacturer { get; set; }
    }
}

3.このプロパティの編集に使用されるUserControl-TypeCodeSelectionControlを作成します。

プロパティ値を編集するUserControl

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace PropertyGrid_ListBox_Test
{
    public partial class TypeCodeSelectionControl : UserControl
    {
        public List<TypeCodes> List { get; set; }
        private IWindowsFormsEditorService editorService;

        public TypeCodeSelectionControl()
        {
            InitializeComponent();
        }

        private void PrepareListBoxes()
        {
            foreach (string myType in Enum.GetNames(typeof(TypeCodes)))
                listBox1.Items.Add(myType);

            foreach (TypeCodes type_code in this.List)
            {
                string enum_value = Enum.GetName(typeof(TypeCodes), type_code);
                listBox1.Items.Remove(enum_value);
                listBox2.Items.Add(enum_value);
            }
        }

        public TypeCodeSelectionControl(List<TypeCodes> list, IWindowsFormsEditorService editorService)
        {
            InitializeComponent();

            this.List = list;
            this.editorService = editorService;

            PrepareListBoxes();
        }

        private void buttonALL_Click(object sender, EventArgs e)
        {
            //
            // Add all items.
            //
            foreach (object obj in listBox1.Items)
            {
                listBox2.Items.Add(obj);
            }
            listBox1.Items.Clear();
        }

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            //
            // Add selected item.
            //
            string item_to_add = (string)listBox1.SelectedItem;
            listBox1.Items.Remove(item_to_add);
            listBox2.Items.Add(item_to_add);
        }

        private void buttonRemove_Click(object sender, EventArgs e)
        {
            //
            // Remove selected item.
            //
            string item_to_remove = (string)listBox2.SelectedItem;
            listBox2.Items.Remove(item_to_remove);
            listBox1.Items.Add(item_to_remove);
        }

        private void buttonNone_Click(object sender, EventArgs e)
        {
            //
            // Remove all items.
            //
            foreach (object obj in listBox2.Items)
            {
                listBox1.Items.Add(obj);
            }
            listBox2.Items.Clear();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //
            // Enable "Add" button only if any of items is selected in the left listbox.
            //
            buttonAdd.Enabled = listBox1.SelectedIndex != -1;
        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            //
            // Enable "Remove" button only if any of items is selected in the right listbox.
            //
            buttonRemove.Enabled = listBox2.SelectedIndex != -1;
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            base.OnVisibleChanged(e);

            //
            // This occures when dropdown UI editor is hiding.
            //
            if (this.Visible == false)
            {
                //
                // Clear previously selected items.
                //
                if (this.List == null)
                {
                    this.List = new List<TypeCodes>();
                }
                else
                {
                    this.List.Clear();
                }

                //
                // Fill the list with currently selected items.
                //
                foreach (string obj in listBox2.Items)
                {
                    this.List.Add((TypeCodes)Enum.Parse(typeof(TypeCodes), obj));
                }
                editorService.CloseDropDown();
            }
        }
    }
}

4.UITypeEditorを作成します-以前に作成されたUserControlを処理するTypeCodeEditor。

using System;
using System.Collections.Generic;
using System.Drawing.Design;
using System.Windows.Forms.Design;

namespace PropertyGrid_ListBox_Test
{
    class TypeCodeEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService editorService = null;
            if (provider != null)
            {
                editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            }

            if (editorService != null)
            {
                TypeCodeSelectionControl selectionControl = new TypeCodeSelectionControl((List<TypeCodes>)value, editorService);
                editorService.DropDownControl(selectionControl);

                value = selectionControl.List;
            }

            return value;
        }
    }
}

5. TypeConverterを作成して、プロパティ値を正しく表示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace PropertyGrid_ListBox_Test
{
    class TypeCodeTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value is string)
            {
                List<TypeCodes> list = new List<TypeCodes>();
                string[] values = ((string)value).Split(new char[] { ';' });
                foreach (string v in values)
                {
                    list.Add((TypeCodes)Enum.Parse(typeof(TypeCodes), v));
                }

                return list;
            }
            return base.ConvertFrom(context, culture, value);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                List<TypeCodes> list = (List<TypeCodes>)value;
                string result = "";
                foreach (TypeCodes type_code in list)
                {
                    result += Enum.GetName(typeof(TypeCodes), type_code) + "; ";
                }
                return result;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
}

6.プロパティに適切な属性を追加して、ドロップダウンカスタムエディターで編集できるようにします。

using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;

namespace PropertyGrid_ListBox_Test
{
    class TestCase
    {
        public TestCase()
        {
            Manufacturer = new List<TypeCodes>();
        }

        [DisplayName("Manufacturer Preparation Type Code")]
        [Editor(typeof(TypeCodeEditor), typeof(UITypeEditor))]
        [TypeConverter(typeof(TypeCodeTypeConverter))]
        public List<TypeCodes> Manufacturer { get; set; }
    }
}

7.結果をお楽しみください:)。 ここに画像の説明を入力してください

コードの一部が、独自のカスタムエディターの作成を継続するのに役立つことを願っています。

完全な例は、https ://github.com/virious/PropertyGrid_CustomDropDownEditorで入手できます。

于 2013-03-04T21:07:43.740 に答える