none
DatagridViewComboboxColumn dependiente de otro RRS feed

  • Pregunta

  • Tengo un datagridview con dos DatagridViewComboboxColumn, y los datos se cargan desde una misma tabla Sql, de esta manera:
      var tabla = obj.RecogerDatos();
    
      foreach(DataRow Fila in tabla.Rows)
    {
    
      if(Fila["Codigo"].ToString().Length > 9)
       {
        ColumnCodigo.Items.Add(Fila["Codigo"].ToString());
        ColumnNombre.Items.Add(Fila["Nombre"].ToString());
       }
    }



    lo que quiero lograr es que si en la ColumnCodigo selecciono el codigo "1.1" en el siguiente combobox ColumnNombre se me coloque automaticamente "Nombre 1.1" y viceversa, si en ColumnNombre selecciono "Nombre 1.1" en el ColumCodigo debe colocarse automaticamte "1.1" y asi con cada uno de los nombres y codigos de mi tabla. ¿Esto puede ser posible?
    viernes, 17 de enero de 2020 17:32

Respuestas

  • Entonces

            private ComboBox comboBox = null;
    
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                comboBox = e.Control as ComboBox;            
            }
    
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                DataGridViewComboBoxCell celda;
                if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnCodigo")
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnNombre"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
                else if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnNombre") 
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnCodigo"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
            }
    
    Esto lo probé y funciona bien, pero lo único que para que se vea el valor cambiado en el otro combobox de la fila hay que hacer click en otra celda.

    viernes, 17 de enero de 2020 22:22

Todas las respuestas

  • Hola Nathaly

    Podes controlar el Evento CellValueChanged. Lo que no se es si ya tenes en los Items de los ComboBoxes los Nombres 1.1, y todos, o simplemente lo que queres es anotar en su propiedad Text. Voy a hacer lo segundo. Si no es así, decime y lo cambiamos.

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        string valor;
        if (dataGridView1.Columns[e.ColumnIndex] == ColumnCodigo)
        {
            valor = dataGridView1.Rows[e.RowIndex].Cells["Codigo"].Value.ToString();
            if (Char.IsDigit(valor[0]) && valor[1] == '.' && Char.IsDigit(valor[2]))
                dataGridView1.Rows[e.RowIndex]["Nombre"].Value = "Nombre " + valor;
        }
        else if (dataGridView1.Columns[e.ColumnIndex] == ColumnNombre)
        {
            valor = dataGridView1.Rows[e.RowIndex]["Nombre"].Value.ToString();  // supone que será algo como Nombre 1.1
            valor = valor.Replace("Nombre ", "");  // y deja sólo algo como 1.1
            dataGridView1.Rows[e.RowIndex]["Codigo"].Value = valor;
        }    
    }

    Saludos

    Pablo


    viernes, 17 de enero de 2020 20:17
  • Gracias por responder, los nombres y los codigos, los agarro de una base de datos, lo que quiero es que al seleccionar cualquier codigo, el ejemplo que coloque fue de 1.1, este código es de ejemplo:

    https://i.imgur.com/m1GbcMr.png

    y salte al siguiente combobox, me aparezca el nombre relacionado a ese codigo, y viceversa, del nombre al codigo, me aparezca ya por defecto en la vista

    viernes, 17 de enero de 2020 20:49
  • Cómo están relacionados los nombres y los códigos? Tienen el mismo índice? Vienen de un DataTable?
    viernes, 17 de enero de 2020 20:57
  • si, vienen de un datatable, estan en la misma tabla, y tienen el mismo index ubicados en el combobox tambien. Lo que quiero es que cuando se seleccione cualquier nombre o codigo, se coloque como valor por defecto su valor, como explique arriba
    • Editado NathalyChR viernes, 17 de enero de 2020 21:04 explicacion
    viernes, 17 de enero de 2020 21:02
  • Entonces

            private ComboBox comboBox = null;
    
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                comboBox = e.Control as ComboBox;            
            }
    
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                DataGridViewComboBoxCell celda;
                if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnCodigo")
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnNombre"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
                else if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnNombre") 
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnCodigo"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
            }
    
    Esto lo probé y funciona bien, pero lo único que para que se vea el valor cambiado en el otro combobox de la fila hay que hacer click en otra celda.

    viernes, 17 de enero de 2020 22:22
  • Muchas gracias! funciona bien :), no tenia idea de como hacerlo
    viernes, 17 de enero de 2020 22:31
  • Otra vez yo :) una pregunta hay una manera de que el indice se agarre desde la base de datos?, porque funciona, pero si meto mucho datos, el combobox me lo ordena alfabéticamente, entonces los indices en el combobox cambian y me muestra otro datos que no corresponde al código. ¿Hay una manera de solucionar eso?. Muchas gracias
    martes, 21 de enero de 2020 13:57
  • Entonces

            private ComboBox comboBox = null;
    
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                comboBox = e.Control as ComboBox;            
            }
    
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                DataGridViewComboBoxCell celda;
                if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnCodigo")
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnNombre"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
                else if (dataGridView1.Columns[e.ColumnIndex].Name == "ColumnNombre") 
                {
                    celda = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells["ColumnCodigo"];
                    celda.Value = celda.Items[comboBox.SelectedIndex];
                }
            }
    Esto lo probé y funciona bien, pero lo único que para que se vea el valor cambiado en el otro combobox de la fila hay que hacer click en otra celda.

    ya arregle lo de hacer click, pero me sucede lo que le comente, espero pueda ayudarme
    martes, 21 de enero de 2020 17:36
  • Hola Nathaly

    De casualidad vi este mensaje nuevo ... ¿Arreglaste lo de hacer click? Qué bueno, me tendrías que dar clase a mi entonces ... 

    A ver ... Si en las consultas de la base de datos NO usas ORDER BY con un campo de texto, no ordena alfabéticamente, y estarían las filas tal cual las fuiste insertando ... 

    Ahora, si no contamos con la ventaja de que las filas estén "alineadas" (¿me imagino que los items de ambos comboBoxes vienen de diferentes tablas?) lo que se me ocurre es ponerle a cada item en su tabla un nuevo campo numérico (onda "small int" creo que es) y que cada item tenga el número de su correspondiente (todos diferentes en una misma tabla), luego en la consulta en TSQL (que me imagino devuelve ambos comboBoxes en el mismo DataTable) para que ambos items de cada pareja estén en la misma fila y por tanto tengan el mismo índice, los unis así:

    SELECT C.codigo, N.nombre
    FROM TablaCodigo C JOIN TablaNombre N
    ON C.numero = N.numero
    
    
    
    Donde numero sería el campo que agregaste en ambas tablas para unir los items codigo y nombre. Y quizás pones más campos en la linea del SELECT (no lo se) u otras cosas en la consulta, pero esta es la mínima y básica para tener "alineados" los campos que serían los items de los comboBoxes, de la forma que a vos se te ocurra que lo marcas con esos números.

    Ah! Y por favor tratame de vos (o tu) ... no soy un abuelo ... tengo apenas 40 pero mi alma es de 15 :) ja ja!

    Saludos

    Pablo

    miércoles, 22 de enero de 2020 3:48
  • Jajaja esta bien, sigue joven, ya esta solucionado, lo que pasa que no me había pasado por aquí, era que tenia en la primera columna, el combobox del código estaba la propiedad sorted en true, y SortMode en Automatic, y en la columna de Nombre la propiedad sorted estaba en false por eso cuando hacia un salto en el código, me refiero a que volteo los números, primero anote un 5 y luego anote un 6 por casualidad, al ordenarme el código me mostraba era el nombre del código 5, tuve que colocar ambas en false, para que el orden que me diera, fuera el orden de la base de datos, no lo ordeno alfabéticamente desde Sql y para evitar que se me ordene en el DataGridView, el ordenado está en false. Gracias por la sugerencias para próximos proyectos :).

    Saludos :)
    viernes, 24 de enero de 2020 23:58