none
DataGridView con combobox enlazado manualmente RRS feed

  • Pregunta

  • Hola.

    Estoy desarrollando un formulario de una aplicación en windows forms y me encuentro con una duda.

    Tengo cargado un DataGridView con una lista de enumerables que obtengo a través de DLINQ. Los elementos son "series" con los campos id, nombre y tipo. El tipo es un valor byte que representa si la serie es de compras (0) o de ventas (1). Estos últimos valores no están en la base de datos, ya que no van a variar, y decidí tenerlos como "constantes".

    Al DataGridView con los datos de las series le añado una columna de tipo DataGridViewComboBoxColumn, y para cada fila añado un elemento DataGridViewComboBoxCell con los valores constantes anteriores. El problema es que no soy capaz de que el combobox coja el valor que le corresponde según el tipo. Os pongo el código de ejemplo

    public SeriesForm()
            {
                InitializeComponent();
                try
                {
                    seriesCTRL = new SeriesCTRL();
                    combos = new List<Combo>();
                    errorProvider = new ErrorProvider(this);
                    Eliminar.Enabled = false;
                    Estado.ForeColor = Color.Blue;
                    pendienteGuardar = false;
                    dataGridView.DataSource = seriesCTRL.GetSeries();
                    dataGridView.Columns[0].Visible = false;
                    CreateComboColumn();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error " + ex.Message);
                }
            }
    
            private void CreateComboColumn()
            {
                DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
                combos.Add(new Combo(0, "Compras"));
                combos.Add(new Combo(1, "Ventas"));
                a.DataSource = combos;
                a.ValueMember = "Id";
                a.DisplayMember = "Nombre";
                dataGridView.Columns.Add(a);
                for (int count = 0; count<dataGridView.Rows.Count; count++)
                {
                    DataGridViewComboBoxCell temp = new DataGridViewComboBoxCell();
                    temp.DataSource = combos;
                    temp.ValueMember = "Id";
                    temp.DisplayMember = "Nombre";
                    dataGridView.Rows[count].Cells[3] = temp;
                    dataGridView.Rows[count].Cells[3].Value = dataGridView.Rows[count].Cells[2].Value;
                }
            }

    La línea en negrita sería la que, entiendo, debería de seleccionar ese valor.

    ¿Alguien me puede echar una mano?

    Muchas gracias!

    martes, 17 de abril de 2012 16:45

Todas las respuestas

  • Al DataGridView con los datos de las series le añado una columna de tipo DataGridViewComboBoxColumn, y para cada fila añado un elemento DataGridViewComboBoxCell con los valores constantes anteriores

    estas equivocando el camino, tu defines la columna del tipo combo, pero asl celdas las crea automaticamente el datagridview cuando asignasn el Datasource

    en tu caso con solo hacer

    private void CreateComboColumn()
    {
    	DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
    	combos.Add(new Combo(0, "Compras"));
    	combos.Add(new Combo(1, "Ventas"));
    	a.DataSource = combos;
    	a.ValueMember = "Id";
    	a.DisplayMember = "Nombre";
    	dataGridView.Columns.Add(a);
    
    }

    ya estaba

    cuando ahces esto

    dataGridView.DataSource = seriesCTRL.GetSeries();

    es que se crearan las filas del grid y con esto asl celdas

    lo que si has olvidado definir una propiedad importante de la columan del combo se trata del

    DataPropertyName

    sino como sabra a que columnas del origen de datos suara para seleccionar del combo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 18 de abril de 2012 5:09
  • Lo primero, muchas gracias por tu respuesta Leandro.

    La verdad es que el código que expuse ya era de la última versión después de intentar varias soluciones, y era un poco a la desesperada.

    Al final el punto clave era la propiedad que me comentaste, obviamente me faltaba especificar el origen de los datos de la columna de los combobox.

    Para que quede por escrito, os pongo el código usado por si ayuda a alguien:

    public SeriesForm()
            {
                InitializeComponent();
                try
                {
                    seriesCTRL = new SeriesCTRL();
                    combos = new List<Combo>();
                    errorProvider = new ErrorProvider(this);
                    Eliminar.Enabled = false;
                    Estado.ForeColor = Color.Blue;
                    pendienteGuardar = false;
                    dataGridView.DataSource = seriesCTRL.GetSeries();
                    dataGridView.Columns[0].Visible = false;
                    CreateComboColumn();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error " + ex.Message);
                }
            }
    
            private void CreateComboColumn()
            {
                DataGridViewComboBoxColumn a = new DataGridViewComboBoxColumn();
                combos.Add(new Combo(0, "Compras"));
                combos.Add(new Combo(1, "Ventas"));
                a.DataSource = combos;
                a.ValueMember = "Id";
                a.DisplayMember = "Nombre";
                a.DataPropertyName = "Tipo";
                a.Name = "Tipo";
                dataGridView.Columns.Add(a);
            }

    Quizás se note que estoy empezando a desarrollar con este lenguaje, y puede que no de con la filosofía correcta a la hora de resolver un problema, por lo que volveré a postear alguna pregunta casi con seguridad.

    Muchas gracias!


    miércoles, 18 de abril de 2012 11:24