2011-08-06 10 views
7

¿Cuál es la forma más fácil de tener un editor de tipo Visual Studio para cadena en PropertyGrid? Por ejemplo, en Autos/Locales/Relojes, puede previsualizar/editar valores de cadena en línea, pero también puede hacer clic en la lupa y ver cadena en la ventana externa.Editor de cadenas de cuadrícula de propiedad C#

+0

se pueden hacer algunos * * de esto con su propio UITypeEditor. –

Respuesta

8

Puede hacerlo a través de UITypeEditor, como se muestra a continuación. Aquí estoy usando en una propiedad individual, pero IIRC También puede subvertir todas las cadenas (de modo que no es necesario para decorar todas las propiedades):

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

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     using(var frm = new Form { Controls = { new PropertyGrid { 
      Dock = DockStyle.Fill, SelectedObject = new Foo { Bar = "abc"}}}}) 
     { 
      Application.Run(frm); 
     } 
    } 
} 

class Foo 
{ 
    [Editor(typeof(FancyStringEditor), typeof(UITypeEditor))] 
    public string Bar { get; set; } 
} 
class FancyStringEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) 
     { 
      using (var frm = new Form { Text = "Your editor here"}) 
      using (var txt = new TextBox { Text = (string)value, Dock = DockStyle.Fill, Multiline = true }) 
      using (var ok = new Button { Text = "OK", Dock = DockStyle.Bottom }) 
      { 
       frm.Controls.Add(txt); 
       frm.Controls.Add(ok); 
       frm.AcceptButton = ok; 
       ok.DialogResult = DialogResult.OK; 
       if (svc.ShowDialog(frm) == DialogResult.OK) 
       { 
        value = txt.Text; 
       } 
      } 
     } 
     return value; 
    } 
} 

Para aplicar esta para todos miembros de cadena: en lugar de añadir el [Editor(...)], se aplican los siguientes principios en algún lugar en la aplicación:

TypeDescriptor.AddAttributes(typeof(string), new EditorAttribute(
    typeof(FancyStringEditor), typeof(UITypeEditor))); 
+0

Debo menospreciar tu respuesta, porque me alienta a ir de manera perezosa y simplemente copiar y pegar tu código. ;) – John

+0

Sí, este código es perfecto, simple y funciona de inmediato. Gracias – IEnumerable

Cuestiones relacionadas