c# - pasar - ¿Cómo crear un elemento personalizado del editor de PropertyGrid que abre un formulario?
llamar un formulario en c# (1)
Tengo una lista <> (mi clase personalizada). Quiero mostrar un elemento específico en esta lista en un cuadro en el control PropertyGrid. Al final de la casilla me gustaría el botón. Al hacer clic, abriría un formulario que, entre otras cosas, les permitiría elegir uno de los elementos de la Lista. Cuando está cerrado, PropertyGrid se actualizaría para reflejar el valor seleccionado.
Cualquier ayuda apreciada.
Necesita implementar un UITypeEditor
modal, usando el servicio IWindowsFormsEditorService
para mostrarlo:
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);
}
}
Nota: si necesita acceder a algo sobre el contexto de la propiedad (el objeto principal, etc.), eso es lo que proporciona el ITypeDescriptorContext
(en EditValue
); le indica el PropertyDescriptor
y la Instance
(el MyType
) que está involucrado.