none
Pasar al Siguiente "Distinto" Registro C# RRS feed

  • Pregunta

  • Estimado buenas tardes, 

     Quisiera pedir su ayuda nuevamente para solucionar algo:

     Tengo un DataGridView el cual tiene una lista de registros:
     1 pera Cocina
     1 Manzana  Cocina
     1  Níspero  Cocina
     2  Pera Cocina

    Sucede que actualmente tengo un código con el cual avanzo y retrocedo sin problemas, PERO necesito que si estoy posicionado en el #1 y presiono el botón siguiente: Pase al #2 y no al #1 siguiente.... 
    Este código utilizo:

       int selectedindex1 = dataGridView5.SelectedRows[0].Index;
                if (selectedindex1 <= 0)
                    return;

                int selectedindex = dataGridView5.SelectedRows[0].Index;
             

                if (selectedindex > cuentaReg - 1)
                    return;


                dataGridView5.ClearSelection();
                dataGridView5.CurrentCell = dataGridView5.Rows[selectedindex - 1].Cells[0];




                dataGridView5.Rows[selectedindex - 1].Selected = true;

     Gracias por su ayuda, Saludos 


    Llegaras a ser lo que quieras ser....

    jueves, 30 de noviembre de 2017 20:50

Respuestas

  • Hace unos días abriste un hilo con una pregunta muy similiar: Pasar al siguiente registro que sea distinto, datagridview C#

    ¿Llegaste a tener algún inconveniente con la solución que te propuse?, considero que es lo que necesitas para resolver el caso que presentas.

    jueves, 30 de noviembre de 2017 21:27
  • ¿Qué valor tiene establecido la variable 'Id'?, si es null, o contiene una cadena de longitud cero o la cadena no contiene un carácter de espacio en blanco es de esperar la excepción que obtienes. Agrega la siguiente validación:

    string Id = Convert.ToString(dataGridView2.Rows[i].Cells[0].Value);
    if (Id.IndexOf(" ") == -1) continue;
    if (currentId.Substring(0, currentId.IndexOf(" ")) != Id.Substring(0, Id.IndexOf(" ")))

    Entiendo que los valores tienen un espacio en blanco tal como adjuntas el ejemplo, ¿verdad? (1 AAA), presupongo también que el valor se encuentra en una misma columna y que no están en columnas separadas.

    Si los errores continúan te agradeceré abras el contexto de la pregunta porque me pasaré la tarde adivinando/especulando lo que sucede.

    jueves, 30 de noviembre de 2017 22:16
  • Entiendo que para el botón [Anterior] deberías tener algo como:

    var currentRow = dataGridView5.CurrentRow;
    if (currentRow != null)
    {
    	for (int i = currentRow.Index-1; i >= 0; i--)
    	{
    		if (Convert.ToString(currentRow.Cells[0].Value) !=
    			Convert.ToString(dataGridView5.Rows[i].Cells[0].Value))
    		{
    			var value = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
    			var row = dataGridView5.Rows.Cast<DataGridViewRow>()
    				.FirstOrDefault(x => Convert.ToString(x.Cells[0].Value) == value);
    
    			dataGridView5.ClearSelection();
    			dataGridView5.CurrentCell = row.Cells[0];
    			row.Selected=true;
    			break;
    		}
    	}
    }

    • Marcado como respuesta Chris-._.- viernes, 1 de diciembre de 2017 22:08
    viernes, 1 de diciembre de 2017 19:50

Todas las respuestas

  • Hace unos días abriste un hilo con una pregunta muy similiar: Pasar al siguiente registro que sea distinto, datagridview C#

    ¿Llegaste a tener algún inconveniente con la solución que te propuse?, considero que es lo que necesitas para resolver el caso que presentas.

    jueves, 30 de noviembre de 2017 21:27
  • Hola Estimado,  gracias por acudir. 

    La verdad no me funciono porque lo plantie de mala forma y la ayuda que me propusiste fue  algo así:

    var currentRow = dataGridView5.CurrentRow;
    
    	if (currentRow != null)
    	{
    		string currentId = Convert.ToString(currentRow.Cells[0].Value);
    		for (int i = currentRow.Index + 1; i < dataGridView5.Rows.Count - 1; i++)		
    		{
    			string Id = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
    			if (currentId.Substring(0, currentId.IndexOf("-")) != Id.Substring(0, Id.IndexOf("-")))
    			{
    				dataGridView5.ClearSelection();
    				dataGridView5.CurrentCell = dataGridView5.Rows[i].Cells[0];
    				dataGridView5.Rows[i].Selected = true;
    				break;                        
    			}
    		}
    	}

     y  en la  parte ( 

    currentId.Substring(0, currentId.IndexOf("-"))) me da error ya que mi registro no llega guion (-) solo el numero....
    Gracias nuevamente Williams :)

    Llegaras a ser lo que quieras ser....

    jueves, 30 de noviembre de 2017 21:34
  • Lo cambie así y funciona, pero cuando llega al ultimo registro deja sin selección las celdas.

     var currentRow = dataGridView5.CurrentRow;
                if (currentRow != null)
                {
                    string currentId = Convert.ToString(currentRow.Cells[0].Value);
                    for (int i = currentRow.Index + 1; i < dataGridView5.Rows.Count - 1; i++)
                    {
                        string Id = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
                        if (currentId.ToString()!=Id.ToString())
                        {
                            dataGridView5.ClearSelection();
                            dataGridView5.CurrentCell = dataGridView5.Rows[i].Cells[0];
                            dataGridView5.Rows[i].Selected = true;
                            break;
                        }
                    }
                }

    Llegaras a ser lo que quieras ser....

    jueves, 30 de noviembre de 2017 21:48
  • No, no es el cambio que he sugerido.

    var currentRow = dataGridView5.CurrentRow;
    if (currentRow != null)
    {
    	string currentId = Convert.ToString(currentRow.Cells[0].Value);
    	for (int i = currentRow.Index + 1; i < dataGridView5.Rows.Count - 1; i++)	
    	{
    		string Id = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
    		if (currentId.Substring(0, currentId.IndexOf(" ")) != Id.Substring(0, Id.IndexOf(" ")))                    
    		{
    			dataGridView5.ClearSelection();
    			dataGridView5.CurrentCell = dataGridView5.Rows[i].Cells[0];
    			dataGridView5.Rows[i].Selected = true;
    			break;
    		}
    	}                
    }

    jueves, 30 de noviembre de 2017 21:54
  • Este error me da si lo hago como sugieres y no de la ultima forma que te mostré la edición.

    Llegaras a ser lo que quieras ser....

    jueves, 30 de noviembre de 2017 21:59
  • ¿Qué valor tiene establecido la variable 'Id'?, si es null, o contiene una cadena de longitud cero o la cadena no contiene un carácter de espacio en blanco es de esperar la excepción que obtienes. Agrega la siguiente validación:

    string Id = Convert.ToString(dataGridView2.Rows[i].Cells[0].Value);
    if (Id.IndexOf(" ") == -1) continue;
    if (currentId.Substring(0, currentId.IndexOf(" ")) != Id.Substring(0, Id.IndexOf(" ")))

    Entiendo que los valores tienen un espacio en blanco tal como adjuntas el ejemplo, ¿verdad? (1 AAA), presupongo también que el valor se encuentra en una misma columna y que no están en columnas separadas.

    Si los errores continúan te agradeceré abras el contexto de la pregunta porque me pasaré la tarde adivinando/especulando lo que sucede.

    jueves, 30 de noviembre de 2017 22:16
  •  Muchas gracias por su respuesta estimado, 

     pero volví  a preguntar ya que la primera vez formule mal la pregunta.  Los Valores no tienen un espacio en blanco, van algo así:
     ID | Producto | Lugar
     1      pera             Cocina
     1      Manzana      Cocina
     1      Níspero         Cocina
     2      Pera             Cocina

     LE agregue la validación y persiste la falla :( 

     string Id = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
                        if (Id.IndexOf(" ") == -1) continue;



    Llegaras a ser lo que quieras ser....

    viernes, 1 de diciembre de 2017 13:54
  • ...Los valores no tienen un espacio en blanco, van algo así:

    Entiendo, realiza los siguientes cambios:

    var currentRow = dataGridView2.CurrentRow;
    if (currentRow != null)
    {                
    	for (int i = currentRow.Index + 1; i < dataGridView2.Rows.Count; i++)                
    	{                    
    		if (Convert.ToString(currentRow.Cells[0].Value) != 
    			Convert.ToString(dataGridView2.Rows[i].Cells[0].Value))
    		{
    			dataGridView2.ClearSelection();
    			dataGridView2.CurrentCell = dataGridView2.Rows[i].Cells[0];
    			dataGridView2.Rows[i].Selected = true;
    			break;
    		}
    	}                
    }

    viernes, 1 de diciembre de 2017 14:29
  • Estimado me funciona perfecto, 

     el único error que continua es cuando retrocedo y estoy en el  segundo registro:

    : 'El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.'

    Intentare la validad propuesta hace un rato, pero ya va.... :) 


    Llegaras a ser lo que quieras ser....

    viernes, 1 de diciembre de 2017 15:56
  • Entiendo que para el botón [Anterior] deberías tener algo como:

    var currentRow = dataGridView5.CurrentRow;
    if (currentRow != null)
    {
    	for (int i = currentRow.Index-1; i >= 0; i--)
    	{
    		if (Convert.ToString(currentRow.Cells[0].Value) !=
    			Convert.ToString(dataGridView5.Rows[i].Cells[0].Value))
    		{
    			var value = Convert.ToString(dataGridView5.Rows[i].Cells[0].Value);
    			var row = dataGridView5.Rows.Cast<DataGridViewRow>()
    				.FirstOrDefault(x => Convert.ToString(x.Cells[0].Value) == value);
    
    			dataGridView5.ClearSelection();
    			dataGridView5.CurrentCell = row.Cells[0];
    			row.Selected=true;
    			break;
    		}
    	}
    }

    • Marcado como respuesta Chris-._.- viernes, 1 de diciembre de 2017 22:08
    viernes, 1 de diciembre de 2017 19:50
  • Gracias Estimado, esta algo distinta la que tenia pero con esta  ya funciona bien y no generar excepción. 

    Saludos y muchas gracias nuevamente :) 


    Llegaras a ser lo que quieras ser....

    viernes, 1 de diciembre de 2017 22:09