2008-12-11 15 views
11

Tengo una clase con una propiedad de cadena, que tiene tanto getter como setter, que a menudo es tan larga que PropertyGrid trunca el valor de la cadena. ¿Cómo puedo forzar a PropertyGrid a mostrar puntos suspensivos y luego abrir un cuadro de diálogo que contenga un cuadro de texto de líneas múltiples para una fácil edición de la propiedad? Sé que probablemente tenga que establecer algún tipo de atributo en la propiedad, pero ¿qué atributo y cómo? ¿Mi diálogo tiene que implementar alguna interfaz de diseñador especial?¿Cómo puedo forzar a PropertyGrid a mostrar un cuadro de diálogo personalizado para una propiedad específica?

Actualización: This es probablemente la respuesta a mi pregunta, pero no pude encontrarla buscando. Mi pregunta es más general y su respuesta se puede usar para construir cualquier tipo de editor personalizado.

Respuesta

17

Debe establecer un [Editor(...)] para la propiedad, dándole un UITypeEditor que hace la edición; como tal (con su propio editor ...)

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 


static class Program 
{ 
    static void Main() 
    { 
     Application.Run(new Form { Controls = { new PropertyGrid { SelectedObject = new Foo() } } }); 
    } 
} 



class Foo 
{ 
    [Editor(typeof(StringEditor), typeof(UITypeEditor))] 
    public string Bar { get; set; } 
} 

class StringEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) 
     { 
      svc.ShowDialog(new Form()); 
      // update etc 
     } 
     return value; 
    } 
} 

Es posible que se ABLT para localizar a un editor existente examinado las propiedades existentes que se comportan como lo desea.

+1

Gracias por la respuesta rápida. Te daré un +1 por ahora y lo marcaré como la respuesta correcta una vez que tenga la oportunidad de probarlo en mi extremo. – flipdoubt

+0

¿Es posible hacer que el cuadro de texto 'Bar' en propertygrid sea solo para que el usuario no pueda pegar texto directamente en el cuadro de texto de la propiedad, sino solo a través de un cuadro de diálogo modal? No se llama a Setter si agrego el atributo ReadOnly (verdadero). – lerner1225

+0

@ lerner1225 Necesita un convertidor de tipo "no hacer nada" - consulte http://stackoverflow.com/a/30194849/127670 –

Cuestiones relacionadas