none
DataGridView con ComboBox DataSource y diferentes opciones RRS feed

  • Pregunta

  • Hola,

    Estoy intentando crear un formulario con un DataGridView que básicamente tiene dos columnas:

    • AdapterTypeName (DataGridViewTextBoxCell)
    • AdapterName (DataGridViewComboBoxCell)

    Lo que quiero hacer es cargar dinámicamente en AdapterName una serie de valores que dependerán de AdapterTypeName.

    Por ejemplo si AdapterTypeName es "ModoRegistro" los posibles valores serían Manual, Automatico

    Si AdapterTypeName es "ModoApertura" los posibles valores serían Compartido, Exclusivo

    Consigo hacer la carga v"acía" para seleccionarlo, pero no cuando lo cargo con un valor seleccionado por alguna razón, en este último caso no se muestra el valor hasta que no hago click.

    Este es mi código:

           public void LoadAdapters()
           { 
                    
                this.dgvAdapters.AutoGenerateColumns = false;
                this.dgvAdapters.DataSource = _item.Adapters;
                if (_item.Adapters != null)
                {
                    this.dgvAdapters.Columns[this.AdapterTypeName.Name].DataPropertyName = this.AdapterTypeName.Name;
                    this.dgvAdapters.Columns[this.AdapterNameName.Name].DataPropertyName = this.AdapterNameName.Name;
                    this.dgvAdapters.Columns[this.AdapterName.Name].DataPropertyName = this.AdapterName.Name;
    
                    foreach (DataGridViewRow row in this.dgvAdapters.Rows)
                    {
                        string adapterTypeName = row.Cells[this.AdapterTypeName.Name].Value.ToString();
    
                        DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells[this.AdapterName.Name];
                        cell.DataSource = GlobalData.Adapters.FindAll(x => x.AdapterTypeName == adapterTypeName).Select(x => x.AdapterTypeName).ToArray();
                        cell.ValueType = typeof(string);
                    }
                }
                
            }

    Al cargar el datagridview sin datos funciona bien, pero cuando ya tiene datos, salta DataError (El valor de la celda no es válido). Lo curioso es que si controlo (inhabilito) y voy pulsando en cada celda AdapterName se van mostrando los valores deseados.

    Alguna sugerencia?


    martes, 27 de marzo de 2018 18:16

Todas las respuestas

  • Yo crearía un nuevo tipo de columna a partir de DataGridViewComboBoxColumn cuyo CellTemplate fuera un nuevo tiop de DataGridViewComboBoxCell.  Este nuevo tipo de celda contendría información de dónde obtener la lista a mostrar basándose, tal vez, en un valor de celda particular.

    Si busca en Internet, encontrará tutoriales acerca de cómo crear nuevos tipos de columna.  Yo encontré este en inglés.


    Jose R. MCP
    Code Samples


    martes, 27 de marzo de 2018 21:59
    Moderador
  • Hola webJose,

    Gracias por la respuesta. Tras realizar bastantes (demasiadas) pruebas, he podido observar que mi ejemplo funciona en condiciones normales. Es decir, si creo ese código tal cual en un formulario funciona correctamente.

    En mi caso no funcionaba porque el combo iba dentro de un UserControl que se cargaba dinámicamente. Como lo tengo que seguir cargando dinámicamente, lo he cambiado por un botón que abre un formulario en modo Dialog. No es lo que quería pero servirá.

    Un saludo.

    martes, 3 de abril de 2018 18:07