Principales respuestas
DataGridView y fila no seleccionada

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
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 preguntarIf DataGridView1.CurrentRow Is Nothing Thendeberías de preguntar también si hay alguna fila seleccionada:If ((DataGridView1.CurrentRow Is Nothing) OrElse _
(DataGridView1.SelectedRows.Count <> 0)) ThenMessageBox.Show( _
"No hay datos seleccionados, no se eliminará ningún registro")ReturnEnd IfDe 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.SelectionChangedIf ((DataGridView1.CurrentRow Is Nothing) OrElse _
(DataGridView1.SelectedRows.Count <> 0)) Then
Button1.Enabled = TrueElse
Button1.Enabled = FalseEnd IfEnd 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]
- Propuesto como respuesta Enrique M. MontejoModerator sábado, 4 de junio de 2011 14:58
- Marcado como respuesta Mint Man sábado, 4 de junio de 2011 15:31
-
"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.- Marcado como respuesta Enrique M. MontejoModerator domingo, 10 de junio de 2018 6:27
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 -
-
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 -
>"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 preguntarIf DataGridView1.CurrentRow Is Nothing Thendeberías de preguntar también si hay alguna fila seleccionada:If ((DataGridView1.CurrentRow Is Nothing) OrElse _
(DataGridView1.SelectedRows.Count <> 0)) ThenMessageBox.Show( _
"No hay datos seleccionados, no se eliminará ningún registro")ReturnEnd IfDe 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.SelectionChangedIf ((DataGridView1.CurrentRow Is Nothing) OrElse _
(DataGridView1.SelectedRows.Count <> 0)) Then
Button1.Enabled = TrueElse
Button1.Enabled = FalseEnd IfEnd 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]
- Propuesto como respuesta Enrique M. MontejoModerator sábado, 4 de junio de 2011 14:58
- Marcado como respuesta Mint Man sábado, 4 de junio de 2011 15:31
-
-
-
"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.- Marcado como respuesta Enrique M. MontejoModerator domingo, 10 de junio de 2018 6:27