none
Ayuda con DataGridView RRS feed

  • Pregunta

  • Buen día!

    Soy principiante en manejo de DataGridView, y tengo un problema. Tengo 2 Columnas, la columna Nombre y la columna Folio.

    La columna folio esta compuesta por número consecutivos de 1 en 1, ejemplo 1,2,3,4 etc.

    Necesito seleccionar una celda de la columna folio y el valor que tenga esa celda compararlo con las demás celdas de la columna folio y las celdas que tengan un valor mas alto restarle 1 a su valor.

    Ejemplo si selecciono la celda con valor 5, buscar en las demás celdas, si encuentra una que tenga un 7 restarle 1 para que sea 6.

    Muchas gracias de Antemano!

    miércoles, 13 de septiembre de 2017 13:54

Respuestas

  • Te adjunto el código para generar la secuencia cuando marcas la casilla y para actualizar la misma cuando quitas la marca de selección.

    private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {            
    	if (((DataGridView)sender).IsCurrentCellDirty)
    		((DataGridView)sender).CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
    	var dgv = (DataGridView)sender;
    	if (dgv.Columns[e.ColumnIndex].Name == "ColCheck")
    	{
    		if (Convert.ToBoolean(dgv[e.ColumnIndex, e.RowIndex].Value))                
    			dgv["ColFolio", e.RowIndex].Value = dgv.Rows.Cast<DataGridViewRow>()
    				.Where(x => Convert.ToBoolean(x.Cells["ColCheck"].Value)).Count();
    		else
    		{
    			int folio = Convert.ToInt32(dgv["ColFolio", e.RowIndex].Value);
    			foreach (DataGridViewRow row in dgv.Rows.Cast<DataGridViewRow>()
    				.Where(x => Convert.ToInt32(x.Cells["ColFolio"].Value) > folio))
    				row.Cells["ColFolio"].Value = (Int32)row.Cells["ColFolio"].Value - 1;
    
    			dgv["ColFolio", e.RowIndex].Value = null;
    		}
    	}
    }



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta JuanK1916 miércoles, 13 de septiembre de 2017 17:52
    miércoles, 13 de septiembre de 2017 16:55

Todas las respuestas

  • La columna Folio es tu primary key?

    Quieres volver a generar algo como un correlativo?  osea 1,3,4,5,6,7,8,10   te de  1,2,3,4,5,6,7,8

    Espero tu respuesta


    Pasa los puntos prro v:

    miércoles, 13 de septiembre de 2017 14:52
  • hola

    Pero la columna Folio no tiene un valor unico, tiene una lista separada por comas, como podrias comparar o aplicar un resta cuando tienes una lista?

    >>si selecciono la celda con valor 5, buscar en las demás celdas, si encuentra una que tenga un 7 restarle 1 para que sea 6.

    pero como es que obtienes el 5 ? si la columna folio tiene varios valores, deberias hacer primero un parse por la coma y de alli que valor usarias?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de septiembre de 2017 15:39
  • Hola:

     Creo que lo mejor es que expliques mejor tu necesidad, porque creo que es muy sencillo de resolver pero como lo estas pensando quizá complique la acción. Por favor, si puedes poner una imagen y un ejemplo con datos, ser mas fácil recomendarte algo sin tratar de adivinar.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 13 de septiembre de 2017 15:44
  • Recuerda que el datagridview es como una matriz para realizar tu algoritmo deberás recorrer dicha matriz.. para restarle 1 al mayor o mayores (con ayudarte a recorrer creo que es suficiente para que desarrolles tu propio algoritmo).. 
     bool encontrado = false;
                for (int f = 0; f < dataGridView1.RowCount; f++)
                {
                   
                        if (encontrado)
                        {
                          dataGridView1.Rows[f].Cells[1].Value=  int.Parse(dataGridView1.Rows[f].Cells[1].Value.ToString()) - 1;
                        }
                        if (encontrado==false && dataGridView1.CurrentRow.Cells[1].Value == dataGridView1.Rows[f].Cells[1].Value)
                        {
                            encontrado = true;
                        }
                    
                }
    Esto  solo funcionaria si todo esta ordenado de manera ascendente.. pero de igual manera solo quería darte una idea lo que hace es restarle 1  a los mayores que el seleccionado... esto me vuele a tarea  xD de escuela! 
    • Editado David_Aponte miércoles, 13 de septiembre de 2017 16:03
    miércoles, 13 de septiembre de 2017 16:01
  • Hola

    Los valores se generan así:
    Tengo una columna de checkbox, que al seleccionar el checkbox, con un contador asigno un número consecutivo en la misma posición pero de la columna Folio. 

    Ejemplo:

    Al seleccionar el primer checkBox, me asigna el 1, al seleccionar el segundo el 2 etc. 

    Supongamos que ya me generó estos números

    1,2,3,4,5

    Lo que quiero es que si quito el checkbox al que tenia asignado el 2, los que sean mayores a 2 les reste 1 para que ocupe su posición

    Adjunto la captura de pantalla en el siguiente link

    https://ibb.co/cbTc4F



    JK

    miércoles, 13 de septiembre de 2017 16:11
  • Hola, asi es como los genero

    Al seleccionar el primer checkBox, me asigna el 1, al seleccionar el segundo el 2 etc. 

    Supongamos que ya me generó estos números

    1,2,3,4,5

    Lo que quiero es que si quito el checkbox al que tenia asignado el 2, los que sean mayores a 2 les reste 1 para que ocupe su posición.

    Adjunto la captura e el siguiente link

    https://ibb.co/cbTc4F


    JK

    miércoles, 13 de septiembre de 2017 16:15
  • Te adjunto el código para generar la secuencia cuando marcas la casilla y para actualizar la misma cuando quitas la marca de selección.

    private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {            
    	if (((DataGridView)sender).IsCurrentCellDirty)
    		((DataGridView)sender).CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
    	var dgv = (DataGridView)sender;
    	if (dgv.Columns[e.ColumnIndex].Name == "ColCheck")
    	{
    		if (Convert.ToBoolean(dgv[e.ColumnIndex, e.RowIndex].Value))                
    			dgv["ColFolio", e.RowIndex].Value = dgv.Rows.Cast<DataGridViewRow>()
    				.Where(x => Convert.ToBoolean(x.Cells["ColCheck"].Value)).Count();
    		else
    		{
    			int folio = Convert.ToInt32(dgv["ColFolio", e.RowIndex].Value);
    			foreach (DataGridViewRow row in dgv.Rows.Cast<DataGridViewRow>()
    				.Where(x => Convert.ToInt32(x.Cells["ColFolio"].Value) > folio))
    				row.Cells["ColFolio"].Value = (Int32)row.Cells["ColFolio"].Value - 1;
    
    			dgv["ColFolio", e.RowIndex].Value = null;
    		}
    	}
    }



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta JuanK1916 miércoles, 13 de septiembre de 2017 17:52
    miércoles, 13 de septiembre de 2017 16:55
  • Muchas gracias, esto es justo lo que necesitaba. 

    JK

    miércoles, 13 de septiembre de 2017 18:10