none
DataGridView y fila no seleccionada RRS feed

  • Pregunta

  • Tengo un DataGridView que se carga con datos de una base. Además tengo un boton para borrar registros seleccionados. No quiero que por error (o no) el usuario presione ese boton sin que tenga algo seleccionado. En una entrada anterior hice la misma consulta. En ese momento, no me pregunten por qué, cómo, pero funcionó utilizando la respuesta que me habia dado Leandro Tuttini.

    Leandro, me sugería colocar en el evento del botón:


    If DataGridView1.CurrentRow Is Nothing Then

                MessageBox.Show("No hay datos seleccionados, no se eliminará ningún registro", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                Exit Sub

            End If

    No entiendo por qué en ese momento funcionó (creo que hasta lo probe con datos y todo) pero ahora con el datagridview lleno de datos cuando presiono el botón, no captura la bifurcación: If DataGridView1.CurrentRow Is Nothing Then

    Sin seleccionar una fila!!!... 

    Se me ocurrió poner un flag booleano en el evento CellClick del DataGridView y reemplazar la bifurcación anterior por esta otra... 


    If FilaSeleccionada = False Then

                MessageBox.Show("No hay datos seleccionados, no se eliminará ningún registro", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                Exit Sub

            End If

    Alguien puede explicarme por qué la bifurcación: "If DataGridView1.CurrentRow Is Nothing Then" no funciona con los registros cargados?


    Marcelo Robin
    viernes, 3 de junio de 2011 15:03

Respuestas

  • >"Mint Man" escribió:
     
    > Tengo un DataGridView que se carga con datos de una base. Además tengo un boton para
    >  borrar registros seleccionados. No quiero que por error (o no) el usuario presione ese boton
    > sin que tenga algo seleccionado. En una entrada anterior hice la misma consulta. En ese
    > momento, no me pregunten por qué, cómo, pero funcionó utilizando la respuesta que me
    >  habia dado Leandro Tuttini.
    >
    > Leandro, me sugería colocar en el evento del botón:
    >
    > If DataGridView1.CurrentRow Is Nothing Then
    >
    > No entiendo por qué en ese momento funcionó (creo que hasta lo probe con datos y todo)
    > pero ahora con el datagridview lleno de datos cuando presiono el botón, no captura la
    > bifurcación: If DataGridView1.CurrentRow Is Nothing Then
    >
    > Sin seleccionar una fila!!!...
     
    ¡Vamos a ver! Si dices que el control DataGridView lo has cargado de datos, SU PROPIEDAD CURRENTROW NUNCA PODRÁ SER NOTHING. Así será cuando el control DataGridView no tenga datos, no tenga ninguna fila o simplemente únicamente aparezca la fila de nuevos registros. Pero si tiene datos, aunque sólo sea una fila distinta a la fila de nuevos registros, la propiedad CurrentRow referenciará a la primera fila del control DataGridView, aquella que tiene por índice el valor 0.
     
    En lugar de preguntar
     
        If DataGridView1.CurrentRow Is Nothing Then
     
    deberías de preguntar también si hay alguna fila seleccionada:
     
       If ((DataGridView1.CurrentRow Is Nothing) OrElse _
             (DataGridView1.SelectedRows.Count <> 0)) Then
     
                MessageBox.Show( _
                    "No hay datos seleccionados, no se eliminará ningún registro")
     
                Return
     
       End If
     
    De todas maneras, entiendo que lo correcto sería que inhabilitaras el control Button hasta que al menos haya una fila seleccionada en el control DataGridView, y ésto lo podrías hacer de manera automática en el evento SelectionChanged del control DataGridView:
     
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) _
            Handles DataGridView1.SelectionChanged
     
            If ((DataGridView1.CurrentRow Is Nothing) OrElse _
                 (DataGridView1.SelectedRows.Count <> 0)) Then

                Button1.Enabled = True
     
            Else
                Button1.Enabled = False
     
            End If
     
     End Sub

    De ésta manera, únicamente se habilitará el control Button HASTA QUE AL MENOS HAYA UNA FILA COMPLETA SELECCIONADA; no es suficiente con que haya varias celdas de la misma fila seleccionadas, tiene que estar seleccionada la fila completa.
     

    Enrique Martínez
      [MS MVP - VB]




    sábado, 4 de junio de 2011 14:54
    Moderador
  • "Oswal Noguera" preguntó:

    > Una Pregunta y si el Datagridview Esta vacio no tiene nada ni fila como hago
    > para que se deshabilita el boton utilizando ese mismo procedimiento que tu usas.

    Hola, Oswal:

    No has indicado si el control DataGridView lo tienes enlazado o no a un origen de datos, como bien puede ser un objeto DataTable, por poner un ejemplo.

    Lo primero que tienes que hacer al cargar el formulario es indicar que por defecto ese control Button estará inhabilitado:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Por defecto el botón estará inhabilitado.
            Button1.Enabled = False
    
        End Sub

    Y suponiendo que lo tienes enlazado a un origen de datos, en su evento DataSourceChanged lo habilitarías/inhabilitarías dependiendo de si el valor de su propiedad DataSource tiene o no el valor Nothing:

        Private Sub DataGridView1_DataSourceChanged(sender As Object, e As EventArgs) Handles DataGridView1.DataSourceChanged
    
            ' Habilitar/inhabilitar el control Button dependiendo de
            ' si su propiedad DataSource es o no Nothing.
            '   
            Button1.Enabled = (Not DataGridView1.DataSource Is Nothing)
    
        End Sub
    

    ¿Que el control DataGridView no lo tienes enlazado a un origen de datos? Entonces habría que ver si le permites o no al usuario añadir y eliminar filas. En el supuesto que la respuesta sea afirmativa, habilitarías el control Button al añadir una fila y lo inhabilitarías cuando la única fila que quede en el control DataGridView sea la fila de nuevos registros:

        Private Sub DataGridView1_UserAddedRow(sender As Object, e As DataGridViewRowEventArgs) Handles DataGridView1.UserAddedRow
    
            ' El usuario ha añadido una fila al control DataGridView;
            ' habilitar el control Button.
            '
            Button1.Enabled = True
    
        End Sub
    
        Private Sub DataGridView1_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles DataGridView1.UserDeletedRow
    
            ' El usuario ha eliminado una fila del control DataGridView;
            ' inhabilitar el control si la fila actual es la fila de
            ' nuevos registros (la última fila).
            '
            Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
            Button1.Enabled = ((Not row Is Nothing) AndAlso (Not row.IsNewRow))
    
        End Sub
    

    Te comento que para que aparezca la fila de nuevos registros, el valor de la propiedad AllowUserToAddRows del control DataGridView deberá tener el valor True, que dicho sea de paso, es su valor por defecto para que los usuarios puedan añadir nuevas filas al control DataGridView.

    En fin, que sin más detalles de cómo tienes configurado el control DataGridView, en principio así es como deberías de habilitar/inhabilitar el control Button.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    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, se inteligente y activa la instrucción
    Option Strict.

    viernes, 8 de junio de 2018 17:31
    Moderador

Todas las respuestas

  • que raro porque lo del

    If DataGridView1.CurrentRow Is Nothing Then

    deberia funcionar

    pero s usas el CellClick podrias directo acceder a la fila seleccionada

     

    Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex)

    de esta forma ya no necesitas usar el CurrentRow, sino que obtienes la fila directo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 3 de junio de 2011 15:12
  • Tendrá que ver que luego de cargar el DataGridView pongo 

    Me.DataGridView1.ClearSelection()

     


    Marcelo Robin
    sábado, 4 de junio de 2011 11:34
  • Es más... al querer apretar el boton, sin nada seleccionado como contaba, sigue de largo y If DataGridView1.CurrentRow Is Nothing Then no lo toma ni en cuenta.

    Si pasa, le puse un mensaje para frenarlo al usuario y le informo que se va a borrar un registro y le doy la opcion de Si, No o Cancelar para tomar la decisión. Resulta que cuando presiono si... ALTO ERROR porque obiamente no existe ningun registro seleccionado.

    En cuanto al Dim row As DataGridViewRow = DataGridView1.Rows(e.RowIndex) eso lo tengo que poner en el CellClick del DataGridView... 

    Pero como lo analizo ese valor desde el boton ?


    Marcelo Robin
    sábado, 4 de junio de 2011 11:40
  • >"Mint Man" escribió:
     
    > Tengo un DataGridView que se carga con datos de una base. Además tengo un boton para
    >  borrar registros seleccionados. No quiero que por error (o no) el usuario presione ese boton
    > sin que tenga algo seleccionado. En una entrada anterior hice la misma consulta. En ese
    > momento, no me pregunten por qué, cómo, pero funcionó utilizando la respuesta que me
    >  habia dado Leandro Tuttini.
    >
    > Leandro, me sugería colocar en el evento del botón:
    >
    > If DataGridView1.CurrentRow Is Nothing Then
    >
    > No entiendo por qué en ese momento funcionó (creo que hasta lo probe con datos y todo)
    > pero ahora con el datagridview lleno de datos cuando presiono el botón, no captura la
    > bifurcación: If DataGridView1.CurrentRow Is Nothing Then
    >
    > Sin seleccionar una fila!!!...
     
    ¡Vamos a ver! Si dices que el control DataGridView lo has cargado de datos, SU PROPIEDAD CURRENTROW NUNCA PODRÁ SER NOTHING. Así será cuando el control DataGridView no tenga datos, no tenga ninguna fila o simplemente únicamente aparezca la fila de nuevos registros. Pero si tiene datos, aunque sólo sea una fila distinta a la fila de nuevos registros, la propiedad CurrentRow referenciará a la primera fila del control DataGridView, aquella que tiene por índice el valor 0.
     
    En lugar de preguntar
     
        If DataGridView1.CurrentRow Is Nothing Then
     
    deberías de preguntar también si hay alguna fila seleccionada:
     
       If ((DataGridView1.CurrentRow Is Nothing) OrElse _
             (DataGridView1.SelectedRows.Count <> 0)) Then
     
                MessageBox.Show( _
                    "No hay datos seleccionados, no se eliminará ningún registro")
     
                Return
     
       End If
     
    De todas maneras, entiendo que lo correcto sería que inhabilitaras el control Button hasta que al menos haya una fila seleccionada en el control DataGridView, y ésto lo podrías hacer de manera automática en el evento SelectionChanged del control DataGridView:
     
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) _
            Handles DataGridView1.SelectionChanged
     
            If ((DataGridView1.CurrentRow Is Nothing) OrElse _
                 (DataGridView1.SelectedRows.Count <> 0)) Then

                Button1.Enabled = True
     
            Else
                Button1.Enabled = False
     
            End If
     
     End Sub

    De ésta manera, únicamente se habilitará el control Button HASTA QUE AL MENOS HAYA UNA FILA COMPLETA SELECCIONADA; no es suficiente con que haya varias celdas de la misma fila seleccionadas, tiene que estar seleccionada la fila completa.
     

    Enrique Martínez
      [MS MVP - VB]




    sábado, 4 de junio de 2011 14:54
    Moderador
  • ES-PEC-TA-CU-LAR

    Maestro!!!

    Abrazo Grande!!!


    Marcelo Robin
    sábado, 4 de junio de 2011 15:32
  • Una Pregunta y si el Datagridview Esta vacio no tiene nada ni fila como hago para que se deshabilita el boton utilizando ese mismo procedimiento que tu usas.

    martes, 5 de junio de 2018 21:15
  • "Oswal Noguera" preguntó:

    > Una Pregunta y si el Datagridview Esta vacio no tiene nada ni fila como hago
    > para que se deshabilita el boton utilizando ese mismo procedimiento que tu usas.

    Hola, Oswal:

    No has indicado si el control DataGridView lo tienes enlazado o no a un origen de datos, como bien puede ser un objeto DataTable, por poner un ejemplo.

    Lo primero que tienes que hacer al cargar el formulario es indicar que por defecto ese control Button estará inhabilitado:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Por defecto el botón estará inhabilitado.
            Button1.Enabled = False
    
        End Sub

    Y suponiendo que lo tienes enlazado a un origen de datos, en su evento DataSourceChanged lo habilitarías/inhabilitarías dependiendo de si el valor de su propiedad DataSource tiene o no el valor Nothing:

        Private Sub DataGridView1_DataSourceChanged(sender As Object, e As EventArgs) Handles DataGridView1.DataSourceChanged
    
            ' Habilitar/inhabilitar el control Button dependiendo de
            ' si su propiedad DataSource es o no Nothing.
            '   
            Button1.Enabled = (Not DataGridView1.DataSource Is Nothing)
    
        End Sub
    

    ¿Que el control DataGridView no lo tienes enlazado a un origen de datos? Entonces habría que ver si le permites o no al usuario añadir y eliminar filas. En el supuesto que la respuesta sea afirmativa, habilitarías el control Button al añadir una fila y lo inhabilitarías cuando la única fila que quede en el control DataGridView sea la fila de nuevos registros:

        Private Sub DataGridView1_UserAddedRow(sender As Object, e As DataGridViewRowEventArgs) Handles DataGridView1.UserAddedRow
    
            ' El usuario ha añadido una fila al control DataGridView;
            ' habilitar el control Button.
            '
            Button1.Enabled = True
    
        End Sub
    
        Private Sub DataGridView1_UserDeletedRow(sender As Object, e As DataGridViewRowEventArgs) Handles DataGridView1.UserDeletedRow
    
            ' El usuario ha eliminado una fila del control DataGridView;
            ' inhabilitar el control si la fila actual es la fila de
            ' nuevos registros (la última fila).
            '
            Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
            Button1.Enabled = ((Not row Is Nothing) AndAlso (Not row.IsNewRow))
    
        End Sub
    

    Te comento que para que aparezca la fila de nuevos registros, el valor de la propiedad AllowUserToAddRows del control DataGridView deberá tener el valor True, que dicho sea de paso, es su valor por defecto para que los usuarios puedan añadir nuevas filas al control DataGridView.

    En fin, que sin más detalles de cómo tienes configurado el control DataGridView, en principio así es como deberías de habilitar/inhabilitar el control Button.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    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, se inteligente y activa la instrucción
    Option Strict.

    viernes, 8 de junio de 2018 17:31
    Moderador