En mi aplicación tengo una cuadrícula de propiedades para permitir a los usuarios cambiar la configuración. Esto funciona bien para las cadenas y otras propiedades de valor, pero lo que necesito ahora es una lista de cadenas de caracteres que puede ser editado por los usuarios.

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

 Constructor on type 'System.String' not found

Este sentido como las cadenas son inmutables. Sin embargo, todavía necesita alguna manera de almacenar varias cadenas (o cadena de datos) en una cuadrícula de propiedades.

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

  • Intenta esto, MyPropertyGrid.SelectedObjec = Prueba //devolverá la cadena de lista en el botón haga clic en establecer la lista de cadenas en la Prueba de la propiedad….
  • No estoy seguro de lo que significa para intentar, como parece que el código fue devorada por las comentando formato.
InformationsquelleAutor KallDrexx | 2011-06-10

3 Comentarios

  1. 43

    Sí, usted puede especificar un Sistema.ComponentModel.Editor, el atributo en la lista de cadenas, con StringCollectionEditor como el editor. Usted necesita agregar una referencia a System.Design.Dll para su proyecto, para que este a compilar.

    Ejemplo, supongamos que su objeto es como este:

    [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 cuadrícula de propiedades que tiene este aspecto:

    ¿Cómo puedo utilizar un WinForms PropertyGrid para editar una lista de cadenas?

    Haga clic en el ... y se obtiene:

    ¿Cómo puedo utilizar un WinForms PropertyGrid para editar una lista de cadenas?

    Si no te gusta el grupo builtin editor de la colección, puede implementar su propio editor de la colección.

    Mi ejemplo muestra el uso de un TypeConverter atributo. Si usted no hacer que, a continuación, la lista se muestra en la proposición de la cuadrícula como «(Colección)». El TypeConverter se pone a mostrar como algo inteligente. Por ejemplo, para mostrar una breve representación de cadena de la colección en la cuadrícula de propiedades, como este:

    ¿Cómo puedo utilizar un WinForms PropertyGrid para editar una lista de cadenas?

    …la TypeConverter es como este:

    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);
        }
    }

    Usted no necesita un setter en el List<String>, debido a que el editor de la colección no establece que la propiedad, simplemente añade o elimina las entradas a la propiedad. Así que acaba de proporcionar el captador.

    • Impresionante, el primer método funciona como un encanto (La cadena editor de la colección debería funcionar bien para mis necesidades). Agradece mucho 🙂
    • Gran Respuesta 🙂
    • Excelente respuesta !
  2. 7

    Si usted sólo necesita una cadena de contenedor sólo tiene que utilizar: BindingList<string> en lugar de list<string>

    El editor se crea automáticamente.

    También, «casting» de ida y vuelta a List<T> es fácil.
    De la Lista a la BindingList solo uso el bList = BindingList(orignalList) constructor (si usted recibe sólo lectura error de insertar la lista uno por uno). y para obtener la lista puede usar el .ToList() método de extensión.

    • Muy buena y fácil de contestar.
  3. 3

    Declaración de propiedad se pierde uno de los atributos importantes:
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

    Sin que el diseñador no serializar datos de la colección.

    • Funciona sin el atributo de si usted utiliza un enlace de la lista, es decir, BindingList<cadena>

Dejar respuesta

Please enter your comment!
Please enter your name here