c# string winforms propertygrid

c# - ¿Cómo puedo usar WinForms PropertyGrid para editar una lista de cadenas?



string (3)

Sí, puede especificar un atributo System.ComponentModel.Editor en su lista de cadenas, con StringCollectionEditor como editor . Debe agregar una referencia a System.Design.Dll a su proyecto para que se pueda compilar.

Ejemplo, supongamos que tu objeto es así:

[DefaultProperty("Name")] public class CustomObject { [Description("Name of the thing")] public String Name { get; set; } [Description("Whether activated or not")] public bool Activated { get; set; } [Description("Rank of the thing")] public int Rank { get; set; } [Description("whether to persist the settings...")] public bool Ephemeral { get; set; } [Description("extra free-form attributes on this thing.")] [Editor(@"System.Windows.Forms.Design.StringCollectionEditor," + "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))] [TypeConverter(typeof(CsvConverter))] public List<String> ExtraStuff { get { if (_attributes == null) _attributes = new List<String>(); return _attributes; } } private List<String> _attributes; }

La grilla de propiedades para eso se ve así:

Haga clic en ... y obtendrá:

Si no le gusta el editor de colecciones integrado, puede implementar su propio editor de colecciones personalizadas .

Mi ejemplo muestra el uso de un atributo TypeConverter. Si no lo hace , la lista se muestra en la cuadrícula de prop como "(Colección)". TypeConverter lo muestra como algo inteligente . Por ejemplo, para mostrar una representación de cadena corta de la colección en la cuadrícula de propiedades, como esta:

... el TypeConverter es así:

public class CsvConverter : TypeConverter { // Overrides the ConvertTo method of TypeConverter. public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { List<String> v = value as List<String>; if (destinationType == typeof(string)) { return String.Join(",", v.ToArray()); } return base.ConvertTo(context, culture, value, destinationType); } }

No necesita un colocador en la List<String> , porque el editor de colecciones no establece esa propiedad, simplemente agrega o elimina entradas a la propiedad. Así que solo proporcione el getter.

En mi aplicación, tengo una grilla de propiedades para permitir a los usuarios cambiar la configuración. Esto funciona bien para cadenas y otras propiedades de valor, pero lo que necesito ahora es una lista de cadenas que pueden ser editadas por los usuarios.

El problema es que si tengo MyPropertyGrid.SelectedObject = new { Test = new List<string>() }; en mi código y el usuario intenta editar la propiedad Test , cuando hacen clic en el botón Agregar, se produce el siguiente error:

Constructor on type ''System.String'' not found

Esto tiene sentido ya que las cadenas son inmutables. Sin embargo, todavía necesito alguna manera de almacenar varias cadenas (o datos tipo cadena) en una cuadrícula de propiedades.

¿Alguien tiene alguna idea sobre cómo puedo lograr esto?


La declaración de propiedad pierde un atributo importante: [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

Sin él, el diseñador no serializa los datos de la colección.


Si solo necesita un contenedor de cadenas, simplemente use: BindingList<string> lugar de list<string>

El editor se crea automáticamente.

Además, "lanzar" de ida y vuelta a List<T> es fácil. De List a BindingList simplemente use el bList = BindingList(orignalList) (si tiene un error de solo lectura, inserte la lista uno por uno). y para obtener la lista puede usar el método de extensión .ToList() .