none
Indicar en un bucle for each hasta que línea de un datagridview se tiene que hacer RRS feed

  • Pregunta

  • Hola a todos:

    Estoy peleando con el datagridview y ya me queda poco por hacer. Bueno, el tema es que necesito que un bucle for Each me lo recorra hasta cierta línea, imaginemos la 15 y a partir de ahí que no me afecte la actualización a las líneas posteriores.

    Os pongo el ejemplo que estoy utilizando y que no se de que manera indicarle al for (en negrita) hasta que línea quiero actualizar, ya que posteriormente hay otras que no se tienen que actualizar. Es decir, que las columnas que se actualizan lo hagan hasta una determina fila.

    Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            'Calculamos los valores de las columnas proyectadas. Multiplicamos el % de Incremento por su valor inicial. (Ejer0)
            Try
                ' Obtenemos la fila actual
                'Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
                ' Obtenemos el valor de la celda actual de la columna 
                Dim cell As DataGridViewCell = DataGridView1.CurrentCell
                If e.ColumnIndex = 7 Then
                    For Each row As DataGridViewRow In Me.DataGridView1.Rows
                        row.Cells(8).Value = Val(row.Cells(7).Value) * PorcIncAutom / 100 + Val(row.Cells(7).Value)
                        row.Cells(9).Value = Val(row.Cells(8).Value) * PorcIncAutom / 100 + Val(row.Cells(8).Value)
                        row.Cells(10).Value = Val(row.Cells(9).Value) * PorcIncAutom / 100 + Val(row.Cells(9).Value)
                        row.Cells(11).Value = Val(row.Cells(10).Value) * PorcIncAutom / 100 + Val(row.Cells(10).Value)
                        row.Cells(12).Value = Val(row.Cells)
    ElseIf e.ColumnIndex = 16 Then
                    For Each row As DataGridViewRow In Me.DataGridView1.Rows
                        row.Cells(17).Value = Val(row.Cells(16).Value) * PorcIncAutom / 100 + Val(row.Cells(16).Value)
                    Next
                Else
                    Me.MetodoComun()
                End If
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    end sub

    Un saludo a todos.

    Gemma.

    miércoles, 1 de mayo de 2013 15:36

Respuestas

  • Dim i as Integer=0

    For Each item In DataGridView1.Rows

    i=i+1 if i=15 then Exit For Next

    Como vez declaro una variable por afuera del bucle forEach y en cada iteraccion del bucle le sumo en uno, entonces cuando llega ala iteraccion 15,  ya no actualiza nada.

    No es necesario que  hagas un bucle For Next, solo debes jugar con la variable i que actua de contador.

    Saludos.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 15:53
  • Puedes poner la condición en el enumerador

    For Each item In DataGridView1.Rows.Cast(Of DataGridViewRow).Where(Function(x) x.Index < 10)
    ...
    Next
    

    o puedes hacer un 

    For Each item In DataGridView1.Rows
    if item.Index > 10 then Exit For
    Next
    

    • Marcado como respuesta gemma_campillo miércoles, 1 de mayo de 2013 16:15
    miércoles, 1 de mayo de 2013 15:51
  • "gemma_campillo" preguntó:

    > querría sumar dos celdas y colocarle el resultado en otra, no se si
    > será creando fórmulas en el mismo CellEndEdit para que tal como lo
    > tengo ahora me actualice las mismas, eso es para una proyección
    > financiera, ...
    >
    > De forma que al cambiar por ejemplo el valor de la celda "x" de la
    > línea 0, en este caso: 100, automáticamente me cambie el total
    > reflejado en la línea 3 por ejemplo.

    Si tu intención es totalizar los valores de cada columna, entiendo que lo puedes hacer en el evento CurrentCellDirtyStateChanged, mejor que en el evento SelectionChanged, del control DataGridView, el cual se desencadena cuando se produce un cambio de celda.

    Échale un vistazo al pequeño ejemplo que te he preparado, que lo único que hace es sumar las filas de cada columna totalizando los valores en la última fila. Es decir, se sumaran los valores de las cinco primeras filas, y cuando llegue a la sexta (la última fila), se abandonará el bucle For ... Next, que era el tema de ésta conversación.

    Demo DataGridView

    Añade al final del evento Load el siguiente código que se me ha olvidado incluirlo en el ejemplo:

            ' La última fila es de sólo lectura.
            DataGridView1.Rows(5).ReadOnly = True
    
            ' Los valores de las celdas de la última fila los establecemos a 0.
            For Each cell As DataGridViewCell In DataGridView1.Rows(5).Cells
                cell.Value = String.Format("{0:N2}", 0)
            Next


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.




    miércoles, 1 de mayo de 2013 18:03
    Moderador
  • Hola Luis:

    Muchas gracias, lo he solucionado aplicando lo que me ha dicho Enrique Martínez.

    Muchas gracias.

    Gemma.

    • Marcado como respuesta gemma_campillo miércoles, 1 de mayo de 2013 16:15
    miércoles, 1 de mayo de 2013 16:14

Todas las respuestas

  • Hola.

    Cual es el criterio correcto para actualizar hasta una fila concreta.

    Es decir indicas en tu pregunta que solo deba actualizar hasta la fila 15. Pero pregunto en realidad es hasta esa linea, o hay un parametro en especial o algo por el estilo que determine que solo es hasta esa fila.

    Guiandonos de tu pregunta.

    Puedes declarar una variable contador y en cada iteracción del bucle ir sumando mas uno. Y si llega el contador a 15, pues ya no actualizas.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 15:43
  • Hola Luis:

    Gracia por responder.

    Es a partir de la línea 15 que hay otra serie de datos que no necesitan actualización, es por eso que no se indicarle en el "  ForEach row AsDataGridViewRowInMe.DataGridView1.Rows" que preciso hacerlo hasta esa determinada línea que no varía.

    No entiendo lo de la variable contador, te refieres quizás a poner un bucle for Next dentro del ForEach.  For i as Integer = 0 to 15 por ejemplo?.

    Bueno, si puedes me indicas si es eso lo que me quieres decir.

    Un cordial saludo.

    Gemma.

    miércoles, 1 de mayo de 2013 15:50
  • Puedes poner la condición en el enumerador

    For Each item In DataGridView1.Rows.Cast(Of DataGridViewRow).Where(Function(x) x.Index < 10)
    ...
    Next
    

    o puedes hacer un 

    For Each item In DataGridView1.Rows
    if item.Index > 10 then Exit For
    Next
    

    • Marcado como respuesta gemma_campillo miércoles, 1 de mayo de 2013 16:15
    miércoles, 1 de mayo de 2013 15:51
  • Dim i as Integer=0

    For Each item In DataGridView1.Rows

    i=i+1 if i=15 then Exit For Next

    Como vez declaro una variable por afuera del bucle forEach y en cada iteraccion del bucle le sumo en uno, entonces cuando llega ala iteraccion 15,  ya no actualiza nada.

    No es necesario que  hagas un bucle For Next, solo debes jugar con la variable i que actua de contador.

    Saludos.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 15:53
  • Para Enrique M. Montejo:

    Tu respuesta No es lo mismo que menciona el usuario Walter MDV en su respuesta??

    el hace uso de la propiedad Index del objeto DataGridViewRow. Salvo que el colocó en la condicion que sea >10 y nada mas. 

    Tu agregaste esto:

      row.Cells(8).Value = Val(row.Cells(7).Value) * PorcIncAutom / 100 + Val(row.Cells(7).Value)
            row.Cells(9).Value = Val(row.Cells(8).Value) * PorcIncAutom / 100 + Val(row.Cells(8).Value)
            row.Cells(10).Value = Val(row.Cells(9).Value) * PorcIncAutom / 100 + Val(row.Cells(9).Value)
            row.Cells(11).Value = Val(row.Cells(10).Value) * PorcIncAutom / 100 + Val(row.Cells(10).Value)
            row.Cells(12).Value = Val(row.Cells)

    Pero desde mi punto de vista tu respuesta es redundante, ya que el usuario ya la habia respondido. O no leiste su respuesta??'


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú


    miércoles, 1 de mayo de 2013 16:04
  • Hola querido amigo:

    Pues si, como siempre era eso lo que necesitaba. Me he tirado un buen rato averiguando donde leches le ponía el tope de líneas, al final he tenido que preguntar porque no lo veía.

    Muchas gracias maestro.

    Enrique, tu que dominas los temas estos y otros, sabes donde podría encontrar algún tutorial práctico (no el de la MSDN) que te enseñe a trabajar con el datagridview más o menos como podemos hacerlo con una hoja de Excel, es para que pueda realizar subtotales, etc. Si lo sabes te agradeceré me lo indiques.

    Un fuerte abrazo de tu amiga, querido maestro.

    Gemma.

    miércoles, 1 de mayo de 2013 16:13
  • Hola Luis:

    Muchas gracias, lo he solucionado aplicando lo que me ha dicho Enrique Martínez.

    Muchas gracias.

    Gemma.

    • Marcado como respuesta gemma_campillo miércoles, 1 de mayo de 2013 16:15
    miércoles, 1 de mayo de 2013 16:14
  • Hola Walter;

    Gracias por responder, al final he tomado la postura del índice: if item.Index > 10 then Exit For

    Un cordial saludo.

    Gemma.

    miércoles, 1 de mayo de 2013 16:16
  • "Luis F.Muños Hidalgo" escribió:

    > Pero desde mi punto de vista tu respuesta es redundante, ya que
    > el usuario ya la habia respondido. O no leiste su respuesta??'

    No, no leí su respuesta: me faltó actualizar el navegador. Cuando he comenzado a redactar mi respuesta, creía que sólo estaba la tuya. Ahora que me he dado cuenta que un usuario ya ha respondido lo mismo que yo, elimino mi respuesta para que no haya RESPUESTAS DUPLICADAS. Espero que tomes nota y hagas tú lo mismo.

    Creo que ya te estás poniendo demasiado "pesadito" con el tema de las respuestas duplicadas. Se puede entender que una respuesta está duplicada cuando haya pasado un tiempo prudencial desde que otro usuario ha respondido, pero no cuando apenas han pasado cinco minutos.

     

     

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 1 de mayo de 2013 16:18
    Moderador
  • Para Enrique:

    En primer lugar  ha que te refieres con el epíteto o adjetivo "Pesadito", no olvides que los dos somos de paises diferentes vivimos del otro lado del mundo, y lo de "pesadito"  como que no lo tengo claro.

    Y no se ha que te refieras pero creo que es la primera o segunda vez que hago ver que respuestas están duplicadas.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    miércoles, 1 de mayo de 2013 16:23
  • Hola a todos:

    Luis, discúlpame que me meta donde no me llaman, pero en este caso me veo en la obligación de indicar que cuando Enrique Martínez había dado su respuesta, yo tenía refrescado el "navegador" y solamente constaban tu respuesta y la de el. La de Walter no había salido, ya que si ese hubiera sido el caso, le habría respondido a Walter indicándole que su respuesta me era favorable.

    Hemos de tener un poco de paciencia todos y no buscarle los tres pies al gato.

    Un cordial saludo.

    Gemma.

    miércoles, 1 de mayo de 2013 16:26
  • "Luis F.Muños Hidalgo" preguntó:

    > En primer lugar  ha que te refieres con el epíteto o adjetivo "Pesadito",
    > no olvides que los dos somos de paises diferentes vivimos del otro lado
    > del mundo, y lo de "pesadito"  como que no lo tengo claro.

    Más bien me refiero al diminutivo de las acepciones 7ª, 10ª o 11ª que del significado figurado de la palabra "pesado" da la Real Academia de la Lengua Española:

    http://lema.rae.es/drae/srv/search?id=QMypNNopxDXX2d1IXyyj

    > Y no se ha que te refieras pero creo que es la primera o segunda vez
    > que hago ver que respuestas están duplicadas.

    Para mí ya son suficientes, y más cuando entre la respuesta de Walter MDV y la mía solo han transcurrido 7 minutos.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    miércoles, 1 de mayo de 2013 16:37
    Moderador
  • "gemma_campillo" preguntó:

    > Enrique, tu que dominas los temas estos y otros, sabes donde podría encontrar
    > algún tutorial práctico (no el de la MSDN) que te enseñe a trabajar con el
    > datagridview más o menos como podemos hacerlo con una hoja de Excel, ...

    Lo siento, Gemma, no conozco ningún tutorial que te pueda recomendar. Lo mucho o poco que conozco el control DataGridView es de mi propia experiencia.

    > ... es para que pueda realizar subtotales, etc.

    Sumando manualmente los valores de cada columna completa, o rango de celdas existentes en ellas, y mostrando el resultado en la celda de la fila que deseemos. ;-)

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 1 de mayo de 2013 16:46
    Moderador
  • Hola Enrique:

    Gracias por responder, es que ahora ya creo que lo domino bastante bien el datagridview, pero lo único que me falta es que hiciera automáticamente ciertos cambios, lo podría hacer con updates, pero, por ejemplo, querría sumar dos celdas y colocarle el resultado en otra, no se si será creando fórmulas en el mismo CellEndEdit para que tal como lo tengo ahora me actualice las mismas, eso es para una proyección financiera, y por ejemplo hay tres valores en una columna.

    Línea 0    100

    Línea 1     50

    Línea 2    150

    De forma que al cambiar por ejemplo el valor de la celda "x" de la línea 0, en este caso: 100, automáticamente me cambie el total reflejado en la línea 3 por ejemplo. Con ese hacer, le estaría dando una gran funcionalidad para el fin que persigo.

    No se o no tengo claro que método me puede permitir hacer eso. Si es el CellEndEdit o hay alguna propiedad mejor que esa, lo que pasa es que ahora con el CellEndEdit actualizo, borro, etc. y me lo hace automáticamente. 

    Bueno querido amigo, era eso lo que precisaba.

    Un abrazo muy grande.

    Gemma.

    miércoles, 1 de mayo de 2013 17:00
  • "gemma_campillo" preguntó:

    > querría sumar dos celdas y colocarle el resultado en otra, no se si
    > será creando fórmulas en el mismo CellEndEdit para que tal como lo
    > tengo ahora me actualice las mismas, eso es para una proyección
    > financiera, ...
    >
    > De forma que al cambiar por ejemplo el valor de la celda "x" de la
    > línea 0, en este caso: 100, automáticamente me cambie el total
    > reflejado en la línea 3 por ejemplo.

    Si tu intención es totalizar los valores de cada columna, entiendo que lo puedes hacer en el evento CurrentCellDirtyStateChanged, mejor que en el evento SelectionChanged, del control DataGridView, el cual se desencadena cuando se produce un cambio de celda.

    Échale un vistazo al pequeño ejemplo que te he preparado, que lo único que hace es sumar las filas de cada columna totalizando los valores en la última fila. Es decir, se sumaran los valores de las cinco primeras filas, y cuando llegue a la sexta (la última fila), se abandonará el bucle For ... Next, que era el tema de ésta conversación.

    Demo DataGridView

    Añade al final del evento Load el siguiente código que se me ha olvidado incluirlo en el ejemplo:

            ' La última fila es de sólo lectura.
            DataGridView1.Rows(5).ReadOnly = True
    
            ' Los valores de las celdas de la última fila los establecemos a 0.
            For Each cell As DataGridViewCell In DataGridView1.Rows(5).Cells
                cell.Value = String.Format("{0:N2}", 0)
            Next


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.




    miércoles, 1 de mayo de 2013 18:03
    Moderador
  • Para Enrique M. Montejo:

    Pues si en realidad te parecí pesado, pues lo siento mucho, te pido disculpas.

    En realidad solo quise seguir las reglas que vos algún día me diste a mi, cuando por error también cometí eso.

    Fumemos la pipa de la paz y que viva el Visual Basic (lo mejor que pudo conocer.. jaja).

    No hay mala honda con vos. Zanjado el tema.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú



    miércoles, 1 de mayo de 2013 18:08
  • Hola Enrique:

    Muchísimas gracias por tu gentileza y tiempo, eso me ayuda mucho para lo que necesito.

    Voy a empezar a trabajar con ello, lo he probado (tu ejemplo) y va de fábula.

    Te agradezco enormemente el tiempo que te he robado, pero es para una buena causa.

    Un fuerte abrazo querido amigo y cuídate mucho.

    Gemma.

    miércoles, 1 de mayo de 2013 21:11