Principales respuestas
MArcar un solo checkbox en un datagridview

Pregunta
-
Hola a todos.
Tengo un datagridview el cual tiene una columna con checkbox. El problema es que preciso que solo se pueda marcar uno y emitir un mensaje que afecta a la fila donde está ese checkbox, pero solo se puede marcar uno cada vez. Entonces he estado mirando por google, foros, etc. y no encuentro la solución. Creo que se tiene que utilizar el evento: Cell_click pero nada, no me funciona. No detecta la row ni nada.
Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Select Case e.ColumnIndex Case 1 'Columna que tiene el checkbox Dim Celda As DataGridViewCheckBoxCell = CType(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell) Dim CE As CheckState = CType(Celda.Value, CheckState) If CE = CheckState.Checked Then Celda.Value = CheckState.Unchecked Else Celda.Value = CheckState.Checked MessageBox.Show("Fila 8") End If End Select End Sub
Os agradecería que me indicarais como puedo realizar esto. Es decir, marcar un solo checkbox y mostrar el mensaje.
Un saludo.
Gemma
domingo, 28 de abril de 2013 15:04
Respuestas
-
...realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila....
Sub dataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged If DataGridView1.CurrentCell.ColumnIndex = 0 Then If DataGridView1.IsCurrentCellDirty Then DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) For Each fila As DataGridViewRow In DataGridView1.Rows If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then fila.Cells(0).Value = False End If Next MsgBox("Fila actual: " & DataGridView1.CurrentCell.RowIndex.ToString) End If End If End Sub
Recuerda que el nº de fila es en base 0 -cero-
"Option Strict On" no es opcional, es necesario.
- Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 18:14
domingo, 28 de abril de 2013 17:21 -
pero si usa el CellClick no obtines el mism efecto y sin checkbox ?
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 16:44
domingo, 28 de abril de 2013 16:38
Todas las respuestas
-
hola
deberias usar el evento CellValidating con este determinas cuando el estado de un checkbox cambio
en realidad determinas cuando se quiere realizar un cambio y este puede ser aplicado, entonces ala lanzarse el evento validarias si hay algun otro chekc marcado previamente
podrias usar
Dim hayMarcado As Boolean = DataGridView1.Rows.Cast(Of DataGridViewRow).Any(Function(x) Convert.ToBoolean(x.Cells("nombrecolcheckbox").Value))
If hayMarcado Then
//aqui anulas la accion mediante el e.Handler = True del validating
End If
con eso no permites que se marque otro checkbox
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Sergio Parra domingo, 28 de abril de 2013 15:21
domingo, 28 de abril de 2013 15:16 -
Hola Leandro:
No me aclaro con este tema, realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila. No se que tengo que poner después de la instrucción If hayMarcado then.
Lo siento, no acabo de saber que tengo que hacer.
De cualquier manera y como siempre, muchas gracias.
Un cordial saludo.
Gemma
domingo, 28 de abril de 2013 15:32 -
pero si necesitas uno marcado para que suas un checkbox, porque simplemente no seleccionas el row resaltando la seleccion
esto ya lo provee el propio datagridview y es automatico, no necesitas hacer nada especial
un check refleja seleccion multiple
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentinadomingo, 28 de abril de 2013 15:46 -
Hola:
Es un form que proviene de vb6 para la valoración de empresas y ahí me funcionaba perfectamente con el vsflexgrid. Es para que el usuario obtenga una información de las fórmulas utilizadas en esa línea, es por eso que preciso que el usuario sepa que cuando pulse en el checkbox obtendrá esa información. Te adjunto la imagen de como lo tengo, el picará en el checkbox y se le desplegarán unas labels con la información referente a ese análisis.
domingo, 28 de abril de 2013 16:01 -
pero si usa el CellClick no obtines el mism efecto y sin checkbox ?
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 16:44
domingo, 28 de abril de 2013 16:38 -
Hola Leandro:
Si, lo voy ha hacer con el cellclick y voy a sacar esa columna, da demasiados problemas. Cuando pulse la línea ya le saldrá la información de la misma en la parte de debajo de la grilla.
Lo dejo como tu dices, era mas por una cuestión de estética y porque algunos usuarios a los que irá el nuevo programa estaban ya acostumbrados al checkbox.
Muchas gracias como siempre por tu ayuda.
Un fuerte abrazo.
Gemma
domingo, 28 de abril de 2013 16:44 -
Lo dejo como tu dices, era mas por una cuestión de estética y porque algunos usuarios a los que irá el nuevo programa estaban ya acostumbrados al checkbox.
el tema mas que nada lo planteaba porque si usabas el evento CellValuChanged debias descmarcar el check que ya tenias marcado y esto volveria a lanzar el evento lo cual afectaria al check que estas marcando, o sea seria un ida y vuelta de eventos que causaria bastante problemas
si era solo validar como comente al principio es bien directo, pero ir anulando opciones anteriores se complcia un poco y si con una simple seleccion con el CellClick se obtiene el mismo efecto creo que es mas sano ir por ese camino
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentinadomingo, 28 de abril de 2013 16:50 -
Si, Leandro ya lo estoy montando de esa manera.
Menos historias y menos problemas.
Gracias querido amigo.
Gemma.
domingo, 28 de abril de 2013 17:10 -
...realmente lo que preciso es que al marcar uno desmarque el anterior y me pueda mostrar por ejemplo el número de fila. Es decir, que solo puede haber uno marcado y que cada vez que cambie de checkbox se anule el anterior y este nuevo muestre el mensaje que asocie por ejemplo con la fila....
Sub dataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged If DataGridView1.CurrentCell.ColumnIndex = 0 Then If DataGridView1.IsCurrentCellDirty Then DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) For Each fila As DataGridViewRow In DataGridView1.Rows If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then fila.Cells(0).Value = False End If Next MsgBox("Fila actual: " & DataGridView1.CurrentCell.RowIndex.ToString) End If End If End Sub
Recuerda que el nº de fila es en base 0 -cero-
"Option Strict On" no es opcional, es necesario.
- Marcado como respuesta gemma_campillo domingo, 28 de abril de 2013 18:14
domingo, 28 de abril de 2013 17:21 -
Hola Carlos:
Gracias pro preocuparte por esto, te estoy muy agradecida.
Va "casi" perfecto, efectivamente me muestra la línea que era lo más importante, te digo el "casi" porque no se como desmarcar el checkbox anterior que estaba marcado, es decir, que al tomar el "foco" el nuevo checkbox, automáticamente el anterior se desmarcara, por lo demás va perfecto. Si supieras solo como poder hacer eso, tendría el tema totalmente solucionado, porque efectivamente ya puedo mostrar mensajes cuando el usuario marque la línea a través del checkbox.
Muy agradecida por tu interés y efectividad.
Un cordial saludo.
Gemma.
domingo, 28 de abril de 2013 18:14 -
Hola Carlos:
Perdón por el "casi", es que va perfecto, había cambiado el index de la columna solamente en ColumnIndex= 0 y tenía que ser 1, y también lo tenía que haber cambiado en fila.Cells(0).Value = False, ya le he puesto el 1 y ahora si, efectivamente se destilda el anterior. Va como una seda.
Muchas gracias otra vez.
Gemma
domingo, 28 de abril de 2013 18:24 -
ok, perfecto entonces!
"Option Strict On" no es opcional, es necesario.
domingo, 28 de abril de 2013 18:48 -
Tal ves sea algo tarde pero realice esto y me funciono que es similar a lo que se menciona pero introduje una linea extra antes del for
'esta parte me permite seleccionar solo un checkbox y se elimina el anterior
DataGridView1.Rows(e.RowIndex).Cells(1).Value = Not DataGridView1.Rows(e.RowIndex).Cells(1).Value
For Each fila As DataGridViewRow In DataGridView1.Rows
If Not fila Is DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex) Then
fila.Cells(1).Value = False
End If
Next
End Subjueves, 4 de julio de 2013 5:44 -
Les paso un código que realiza lo que necesitan, deben de tener una grilla con al menos dos columnas: NroDocumento y Opcion que será la que tenga el checkbox.
Private Sub dgv_Listado_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgv_Listado.CellMouseClick
Control_Seleccion()
End Sub
Private Sub Control_Seleccion()
Try
Dim rowIndex As Integer = dgv_Listado.CurrentCell.RowIndex
'Dim columnIndex As Integer = dgv_Listado.CurrentCell.ColumnIndex
Dim enumerator As IEnumerator
Dim str As String = Convert.ToString(Me.dgv_Listado.Item("NroDocumento", rowIndex).Value)
Try
enumerator = DirectCast(Me.dgv_Listado.Rows, IEnumerable).GetEnumerator
Do While enumerator.MoveNext
Dim current As DataGridViewRow = DirectCast(enumerator.Current, DataGridViewRow)
If str <> current.Cells.Item("NroDocumento").Value.ToString.Trim Then
current.Cells.Item("Opcion").Value = False
End If
Loop
Finally
If TypeOf enumerator Is IDisposable Then
TryCast(enumerator, IDisposable).Dispose()
End If
End Try
Catch ex As Exception
MessageBox.Show(ex.Message, "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End Submartes, 4 de marzo de 2014 17:27