none
Habilitar columna para edición en DataGridView RRS feed

  • Pregunta

  • Saludos, quisiera saber como habilitar una columna en un DataGridView que se encuentra enlazado a una colección de objetos.

    Cuento con un objeto BindingSource enlazado a un Idictionary<string,string> (mapeo) el cual se lo paso al DataSource del DataGridView:

      BindingSource bindingSource = new BindingSource();
                bindingSource.DataSource = mapeo;
               
                dataGridOportunidades.DataSource = bindingSource;

     

    Los datos se muestran correctamente, pero no puedo editar ninguna columna, de hecho la propiedad ReadOnly viene false..existe otro metodo mejor para cargar una colección de objetos sin utilizar el tipico Row.Add()..

    miércoles, 14 de septiembre de 2011 19:33

Respuestas

  • con un objeto BindingSource enlazado a un Idictionary<string,string> (mapeo) el cual se lo paso al DataSource

    un diccionario que raro que funcione, proque este no tiene el concepto de estructura en tabla

    aunque se que para que estos objetos sean editables deberias ir a un

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 14 de septiembre de 2011 19:43
  • Hola,

    Vamos a ver que esto esta claro

    1. Mapeo dices que es del tipo IDictionary<string,string>

    Bueno pues si es de ese tipo este hereda de ICollection<KeyValuePair<string,string>>, con lo cual cuando tu recorres mapeo con la sentencia 

    foreach (object x in mapeo)
                    lista.Add(x)

    En lista que que es del tipo BindingList esta agregando un objeto del tipo KeyValuePair y este objeto está definido de la siguiente forma.

    [Serializable, StructLayout(LayoutKind.Sequential)]
    public struct KeyValuePair<TKey, TValue>
    {
        private TKey key;
        private TValue value;
        public KeyValuePair(TKey key, TValue value);
        public TKey Key { get; }
        public TValue Value { get; }
        public override string ToString();
    }
    
    

    Con lo cual las propiedades publicas que expone son Key y Value. Por eso no te deja modificar, porque tanto la una como la otra estan definidas con get es decir no implementan set y por tanto son de solo lectura. 

    Por eso es por lo que no puedes modificar.

     

    Aclarado esto lo normal es que si tu quieres modificar un DataGrid sigas el ejemplo que Leandro te paso en el segundo Link.

     

    A que los valores que te aparecen en las columnas son Key y Value ?

     

    Lo que tienes que hacer es crear una clase con dos propiedades del tipo string con modificadores de acceso get,set y después un List<T> donde T es del tipo de tu clase. Ese es el que tienes que enlazar al DataGrid y podras modificar todas las propiedades que implementen los modificadores get y set como public.

    Saludos.


    phurtado
    miércoles, 14 de septiembre de 2011 23:08
    Moderador
  • pregunta, en lugar de usar un IDictionary porque no creas un objeto que pueda editarse

    por ejemplo un

    public class Datos{
    
       public string Key{get; set;}
    
       public string Value{get; set;}
    
    }
    entonces creas una lista del tipo
    List<Datos> mapeo = new List<Datos>();
    
    //aqui cargas los datos de la lista, aqui solo pongo un item pero puedes asignar mas
    
    Datos dato = new Datos(){
    
       Key = "1",
    
       Value = "valor"
    
    };
    
    mapeo.Add(dato);
    
    dataGrid.DataSource = mapeo ;
    de estra forma las propeidades si pedes mapearla a columans del grid

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 15 de septiembre de 2011 2:39

Todas las respuestas

  • con un objeto BindingSource enlazado a un Idictionary<string,string> (mapeo) el cual se lo paso al DataSource

    un diccionario que raro que funcione, proque este no tiene el concepto de estructura en tabla

    aunque se que para que estos objetos sean editables deberias ir a un

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 14 de septiembre de 2011 19:43
  • Saludos, lo probe de las 2 formas:

    Nota: mapeo es un IDictionary<string,string>

    1)  BindingSource bindingSource = new BindingSource();
           
                bindingSource.DataSource = mapeo;
                dataGrid.DataSource = bindingSource;

    2)    BindingList<object> lista =new BindingList<object>();
                foreach (object x in mapeo)
                    lista.Add(x);

           dataGrid.DataSource = lista;

     

    Al final el DataGridView muestra los datos correctamente, pero NO me permite editar ninguna celda y la propiedad ReadOnly de la columna que uso viene false

    Si coloco el valor de la propiedad ReadOnly a false me manda un error

    dataGrid.Columns[0].ReadOnly=false

     

    Error-->Una columna enlazada a un archivo de solo lectura debe tener ReadOnly a True

    miércoles, 14 de septiembre de 2011 21:54
  • Hola,

    Vamos a ver que esto esta claro

    1. Mapeo dices que es del tipo IDictionary<string,string>

    Bueno pues si es de ese tipo este hereda de ICollection<KeyValuePair<string,string>>, con lo cual cuando tu recorres mapeo con la sentencia 

    foreach (object x in mapeo)
                    lista.Add(x)

    En lista que que es del tipo BindingList esta agregando un objeto del tipo KeyValuePair y este objeto está definido de la siguiente forma.

    [Serializable, StructLayout(LayoutKind.Sequential)]
    public struct KeyValuePair<TKey, TValue>
    {
        private TKey key;
        private TValue value;
        public KeyValuePair(TKey key, TValue value);
        public TKey Key { get; }
        public TValue Value { get; }
        public override string ToString();
    }
    
    

    Con lo cual las propiedades publicas que expone son Key y Value. Por eso no te deja modificar, porque tanto la una como la otra estan definidas con get es decir no implementan set y por tanto son de solo lectura. 

    Por eso es por lo que no puedes modificar.

     

    Aclarado esto lo normal es que si tu quieres modificar un DataGrid sigas el ejemplo que Leandro te paso en el segundo Link.

     

    A que los valores que te aparecen en las columnas son Key y Value ?

     

    Lo que tienes que hacer es crear una clase con dos propiedades del tipo string con modificadores de acceso get,set y después un List<T> donde T es del tipo de tu clase. Ese es el que tienes que enlazar al DataGrid y podras modificar todas las propiedades que implementen los modificadores get y set como public.

    Saludos.


    phurtado
    miércoles, 14 de septiembre de 2011 23:08
    Moderador
  • pregunta, en lugar de usar un IDictionary porque no creas un objeto que pueda editarse

    por ejemplo un

    public class Datos{
    
       public string Key{get; set;}
    
       public string Value{get; set;}
    
    }
    entonces creas una lista del tipo
    List<Datos> mapeo = new List<Datos>();
    
    //aqui cargas los datos de la lista, aqui solo pongo un item pero puedes asignar mas
    
    Datos dato = new Datos(){
    
       Key = "1",
    
       Value = "valor"
    
    };
    
    mapeo.Add(dato);
    
    dataGrid.DataSource = mapeo ;
    de estra forma las propeidades si pedes mapearla a columans del grid

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 15 de septiembre de 2011 2:39
  • Saludos, gracias leandro, asi lo implemente manejando sus propiedades key y value como lo indicas, ya que de la otra forma me daba los mismos resultados, es decir, me bloqueaba las columnas..

     

    Gracias!

    lunes, 19 de septiembre de 2011 13:57