none
Problema al eliminar fila de datagridview RRS feed

  • Pregunta

  • Buen dia a todos. Estoy trabajando en un programa de simulacion en el cual piden que solamente se manejen con las ultimas dos filas generadas, por lo que tengo que descartar las anteriores.

    Mi idea fue crear un if e ir borrando las filas anteriores, el codigo es este:

                If (i >= 2) Then
                    dgvDatos.Rows.Remove(dgvDatos.Rows(i - 2))
                End If

    donde i es el indice del ciclo for.

    Probe con una ejecucion de 3 ciclos y finciona bien. Con 4 ciclos en lugar de borrarme las filas 0 y 1, me borra la fila 0 y 3. Y con 5 ciclos tira el siguiente error:

    "El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
    Nombre del parámetro: index"

    No se que puede ser, para mi el condicional para borrar esta bien. Si alguien me puede ayudar, le agradeceria.

    viernes, 27 de febrero de 2015 3:04

Todas las respuestas

  • Hola,

    ¿DataGridView en VB6? Debo entender que equivocaste el foro y debiste haberlo hecho en VB .Net

    ¿Es necesario borrar los items? 

    Private Sub button1_Click(sender As Object, e As EventArgs)
    	For Each row As DataGridViewRow In dataGridView1.Rows
    		If dataGridView1.Rows.Count > 2 Then
    			dataGridView1.Rows.RemoveAt(0)
    		End If
    	Next
    End Sub

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    viernes, 27 de febrero de 2015 3:40
  • Si, es VB.NET perdon.

    No funciona la solucion que sugeriste, tira error "El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección."

    El problema es que necesito seguir agregando filas.

    El programa hace por ejemplo 100 ejecuciones (en cada ejecucion hace calculos y voy agregando las filas a la grilla de a 1) y necesito borrar las filas 1 a la 98 y dejar solamente la 99 y 100. Todo depende de cuantas ejecuciones se requieran antes de empezar.

    Yo intente borrar las filas con dos indices anteriores al que se calcula, pero me tira error.

    Este es el codigo del metodo, es un poco extenso
    Private Sub PrimerEjecucion()
            Dim rnd_llegada As Double = Rnd()
            Dim cantEjecuciones = Val(txtNumero_ciclos.Text)
            reloj_programacion = 0
    
            Dim cola As Integer = 0
            Dim tipo_tarea As String
            Dim tiempo_tarea As Double
            Dim promedio_cola As Double = 0
            Dim cant_tareas As Integer = 0
            Dim cant_filas As Integer
            Dim contador As Integer = 0
            Dim rnd_tipoTarea As Double = Rnd()
            Dim rnd_tiempoTarea As Double = Rnd()
            Dim comprobacion As Integer = 0
    
            Dim proxima As Double = ProximaLlegada(rnd_llegada)
    
            For i As Integer = 0 To cantEjecuciones - 1
                comprobacion = i - 2
                dgvDatos.Rows.Add()
                If (i = 0) Then
    
    
                    dgvDatos.Rows(i).Cells(0).Value = Eventos.Inicio
                    dgvDatos.Rows(i).Cells(1).Value = reloj_programacion
                    dgvDatos.Rows(i).Cells(2).Value = rnd_llegada
    
                    dgvDatos.Rows(i).Cells(3).Value = proxima
                    dgvDatos.Rows(i).Cells(4).Value = reloj_programacion + proxima
                    llegada_tarea = reloj_programacion + proxima
                    dgvDatos.Rows(i).Cells(4).Style.BackColor = Color.Red
    
                    dgvDatos.Rows(i).Cells(5).Value = 0
                    dgvDatos.Rows(i).Cells(6).Value = 0
                    dgvDatos.Rows(i).Cells(7).Value = 0
                    dgvDatos.Rows(i).Cells(8).Value = 0
                    dgvDatos.Rows(i).Cells(9).Value = 0
    
                    fin_tarea = 0
                    dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Libre
                    dgvDatos.Rows(i).Cells(11).Value = 0
    
                    tiempo_ocioso += dgvDatos.Rows(0).Cells(4).Value - dgvDatos.Rows(0).Cells(1).Value
                    dgvDatos.Rows(i).Cells(12).Value = tiempo_ocioso
                    dgvDatos.Rows(i).Cells(13).Value = 0
                    
                    dgvDatos.Rows(i).Cells(14).Value = 1
                    dgvDatos.Rows(i).Cells(15).Value = i
                    dgvDatos.Rows(i).Cells(16).Value = cant_filas
    
                Else
                    If (fin_tarea = 0) Then
                        cant_tareas = 1
                        dgvDatos.Rows(i).Cells(0).Value = Eventos.LlegadaTarea
                        reloj_programacion = llegada_tarea
                        dgvDatos.Rows(i).Cells(1).Value = reloj_programacion
                        dgvDatos.Rows(i).Cells(2).Value = rnd_llegada
    
                        
    
                        proxima = ProximaLlegada(rnd_llegada)
    
                        dgvDatos.Rows(i).Cells(3).Value = proxima
                        dgvDatos.Rows(i).Cells(4).Value = llegada_tarea + proxima
                        llegada_tarea = llegada_tarea + proxima
    
                        dgvDatos.Rows(i).Cells(5).Value = rnd_tipoTarea
                        tipo_tarea = TipoTarea(rnd_tipoTarea)
    
                        dgvDatos.Rows(i).Cells(6).Value = tipo_tarea
    
                        dgvDatos.Rows(i).Cells(7).Value = rnd_tiempoTarea
    
    
                        If (tipo_tarea = "A") Then
                            tiempo_tarea = CalculoTareasA(rnd_tiempoTarea)
                            dgvDatos.Rows(i).Cells(8).Value = tiempo_tarea
    
    
                        Else
                            tiempo_tarea = CalculoTareasB(rnd_tiempoTarea)
                            dgvDatos.Rows(i).Cells(8).Value = tiempo_tarea
    
    
                        End If
    
                        dgvDatos.Rows(i).Cells(9).Value = llegada_tarea + tiempo_tarea
                        fin_tarea = llegada_tarea + tiempo_tarea
    
    
                        dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Ocupado
                        dgvDatos.Rows(i).Cells(11).Value = 0
    
                    ElseIf (fin_tarea <> 0) Then
                        
                        If (llegada_tarea < fin_tarea) Then
                            dgvDatos.Rows(i).Cells(0).Value = Eventos.LlegadaTarea
                            cant_tareas += 1
                            reloj_programacion = llegada_tarea
                            dgvDatos.Rows(i).Cells(1).Value = reloj_programacion
                            dgvDatos.Rows(i).Cells(2).Value = rnd_llegada
    
                            proxima = ProximaLlegada(rnd_llegada)
    
                            dgvDatos.Rows(i).Cells(3).Value = proxima
    
    
                            dgvDatos.Rows(i).Cells(4).Value = llegada_tarea + proxima
                            llegada_tarea = llegada_tarea + proxima
    
    
                            dgvDatos.Rows(i).Cells(5).Value = 0
                            dgvDatos.Rows(i).Cells(6).Value = ""
                            dgvDatos.Rows(i).Cells(7).Value = 0
                            dgvDatos.Rows(i).Cells(8).Value = 0
                            dgvDatos.Rows(i).Cells(9).Value = fin_tarea
    
                            dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Ocupado
                            dgvDatos.Rows(i).Cells(11).Value = cola + 1
                            cola = cola + 1
    
                        Else
                            
                            dgvDatos.Rows(i).Cells(0).Value = Eventos.FinTarea
                            reloj_programacion = fin_tarea
                            dgvDatos.Rows(i).Cells(1).Value = reloj_programacion
    
                            dgvDatos.Rows(i).Cells(2).Value = 0
                            dgvDatos.Rows(i).Cells(3).Value = 0
                            dgvDatos.Rows(i).Cells(4).Value = llegada_tarea
    
    
                            
                            If (cola > 0) Then
                                dgvDatos.Rows(i).Cells(5).Value = rnd_tipoTarea
                                tipo_tarea = TipoTarea(rnd_tipoTarea)
    
                                dgvDatos.Rows(i).Cells(6).Value = tipo_tarea
                                dgvDatos.Rows(i).Cells(7).Value = rnd_tiempoTarea
    
                                If (tipo_tarea = "A") Then
                                    tiempo_tarea = CalculoTareasA(rnd_tiempoTarea)
                                    dgvDatos.Rows(i).Cells(8).Value = tiempo_tarea
    
                                Else
                                    tiempo_tarea = CalculoTareasB(rnd_tiempoTarea)
                                    dgvDatos.Rows(i).Cells(8).Value = tiempo_tarea
    
                                End If
                                dgvDatos.Rows(i).Cells(9).Value = tiempo_tarea + reloj_programacion
                                fin_tarea = tiempo_tarea + reloj_programacion
    
                                dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Ocupado
                                dgvDatos.Rows(i).Cells(11).Value = cola - 1
                                cola = cola - 1
    
                            Else
                                dgvDatos.Rows(i).Cells(5).Value = 0
                                dgvDatos.Rows(i).Cells(6).Value = ""
                                dgvDatos.Rows(i).Cells(7).Value = 0
                                dgvDatos.Rows(i).Cells(8).Value = 0
                                fin_tarea = 0
                                dgvDatos.Rows(i).Cells(9).Value = fin_tarea
    
                                dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Libre
                                dgvDatos.Rows(i).Cells(11).Value = 0
    
                            End If
                        End If
                    End If
    
                    If (dgvDatos.Rows(i).Cells(4).Value < dgvDatos.Rows(i).Cells(9).Value Or dgvDatos.Rows(i).Cells(9).Value = 0) Then
                        dgvDatos.Rows(i).Cells(4).Style.BackColor = Color.Red
                    Else
                        dgvDatos.Rows(i).Cells(9).Style.BackColor = Color.Red
                    End If
    
                    If (dgvDatos.Rows(i).Cells(10).Value = EstadoOperador.Libre) Then
                        tiempo_ocioso += dgvDatos.Rows(i).Cells(4).Value - dgvDatos.Rows(i).Cells(1).Value
                    End If
                    dgvDatos.Rows(i).Cells(12).Value = tiempo_ocioso
    
                    promedio_cola = cola / cant_tareas * 100
                    dgvDatos.Rows(i).Cells(13).Value = promedio_cola
    
                    cant_filas = dgvDatos.Rows.Count
    
                    dgvDatos.Rows(i).Cells(14).Value = i + 1
                    dgvDatos.Rows(i).Cells(15).Value = i
                    dgvDatos.Rows(i).Cells(16).Value = cant_filas
    
                End If
    
    
                If (comprobacion >= 0) Then
    
                  dgvDatos.Rows.RemoveAt(comprobacion)
    
                End If
    
    
            Next
    
            btn_ejecutar.Enabled = False
            btn_salir.Enabled = True
    
        End Sub



    • Editado rodreta viernes, 27 de febrero de 2015 6:05
    viernes, 27 de febrero de 2015 3:49
  • Hola,

    Mil disculpas, equivoque la solución propuesta. Intenta hacer lo siguiente

    Dim i As Integer = 0
    While dataGridView1.Rows.Count > 2
    	dataGridView1.Rows.RemoveAt(0)
    	i += 1
    End While

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    viernes, 27 de febrero de 2015 4:09
  • Con 3 ejecuciones funciona bien, al igual que el if que agregue yo. Pero cuando se hacen 4 ejecuciones tira el error

    "El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
    Nombre del parámetro: index"

    cuando quiere agregar otra fila

    viernes, 27 de febrero de 2015 4:17
  • Hola,

    La solución que te propuse elimina todas las filas una vez creadas todas, recién me doy cuenta que las borras mientras las vas creando, si es eso esto debería solucionar el problema

    if (dataGridView1.Rows.Count > 2)
                    {
                        dataGridView1.Rows.RemoveAt(0);
                    }

    viernes, 27 de febrero de 2015 4:37
  • No funciona esa solucion.

    Es como el if que habia planteado yo, que tampoco me funciona. Sinceramente no se que esta mal, pero no puedo hacer que se eliminen las filas anteriores.

    Si utilizo el if para ocultar filas, funciona correctamente, me oculta las filas anteriores, pero para eliminarlas no.

    viernes, 27 de febrero de 2015 6:11