私はこれをアプリケーションで見ましたが、C#を使用してWinFormでこれを実行できるかどうか疑問に思っています。私はPropertyGridコントロールをカスタマイズした経験がないので、コードについて親切に助けていただければ幸いです。前もって感謝します。
Sceenshot:
それを達成するためのいくつかのステップがあります。
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を作成します。
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で入手できます。