如何创建打开表单的自定义PropertyGrid编辑器项?

我有一个List (我的自定义类)。 我想在PropertyGrid控件的框中显示此列表中的特定项。 在盒子的最后,我想要[…]按钮。 单击时,它将打开一个表单,除其他外,它将允许他们从列表中选择一个项目。 关闭时,PropertyGrid将更新以反映所选值。

任何帮助赞赏。

您需要实现一个模态UITypeEditor ,使用IWindowsFormsEditorService服务来显示它:

 using System.ComponentModel; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; using System; class MyType { private Foo foo = new Foo(); public Foo Foo { get { return foo; } } } [Editor(typeof(FooEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ExpandableObjectConverter))] class Foo { private string bar; public string Bar { get { return bar; } set { bar = value; } } } class FooEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) { IWindowsFormsEditorService svc = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; Foo foo = value as Foo; if (svc != null && foo != null) { using (FooForm form = new FooForm()) { form.Value = foo.Bar; if (svc.ShowDialog(form) == DialogResult.OK) { foo.Bar = form.Value; // update object } } } return value; // can also replace the wrapper object here } } class FooForm : Form { private TextBox textbox; private Button okButton; public FooForm() { textbox = new TextBox(); Controls.Add(textbox); okButton = new Button(); okButton.Text = "OK"; okButton.Dock = DockStyle.Bottom; okButton.DialogResult = DialogResult.OK; Controls.Add(okButton); } public string Value { get { return textbox.Text; } set { textbox.Text = value; } } } static class Program { [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 MyType(); Application.Run(form); } } 

注意:如果您需要访问有关属性上下文(父对象等)的内容,那就是ITypeDescriptorContext (在EditValue )提供的内容; 它会告诉您涉及的PropertyDescriptorInstanceMyType )。