DataGridView y MultiSelect

24/12/2006 - 19:54 por Carlos Gómez | Informe spam
Cuando tienes un DataGridView con MutiSelect a True y
SelectionMode=FullRowSelect, permite tener más de una fila
seleccionada.
Ahora bien, resulta que al hacer click sobre una fila, la selección de
filas que había se borra, y se queda únicamente la fila en la que se
ha hecho Click seleccionada.

Alguien sabe como evitar que esto ocurra, es decir, que la selección
que se tenga no se pierda, y la fila a la que se le ha hecho click pase
a estar seleccionada (si no lo estaba ya) o se elimine de la colección
de filas seleccionadas (si ya estaba seleccionada antes del click)

Preguntas similare

Leer las respuestas

#1 SoftJaén
25/12/2006 - 10:54 | Informe spam
"Carlos Gómez" preguntó:

Alguien sabe como evitar que esto ocurra, es decir, que la selección
que se tenga no se pierda, y la fila a la que se le ha hecho click pase
a estar seleccionada (si no lo estaba ya) o se elimine de la colección
de filas seleccionadas (si ya estaba seleccionada antes del click)



Hola, Carlos:

Si he entendido bien, lo que tienes que hacer para que la nueva fila
seleccionada no te elimine las anteriormente seleccionadas, es mantener
pulsada la tecla «Control» mientras seleccionas con el ratón otras filas
cualquiera. Ese ha sido siempre el comportamiento de todos los controles del
tipo cuadrícula o Grid, y al que la mayoría de usuarios se encuentra
acostumbrado, cuando desean seleccionar varias filas no consecutivas.

Un saludo y ¡Feliz Navidad!

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.
Respuesta Responder a este mensaje
#2 Carlos Gómez
25/12/2006 - 13:49 | Informe spam
Gracias por responder.

Efectivamente, has entendido bien. El problema reside en que el
programa va a ser usado tanto en pantalla 'convencional' y pantalla
tactil, por lo que el uso del teclado no puede ser -en general-
estrictamente necesario, y solo se permite en zona de entrada de datos:
nombres, descripciones Para todo lo demás va a fuerza de
desplegables y lo que haga falta

La pregunta realmente es si se puede modificar ese comportamiento.
Porque aunque lo he simulado mediante código -evento mouseDown- evento
CellClick y evento mouseUp, se produce un parpedeo que no queda bien
del todo, y lo más importante, la multiselección haciendo el uso
habitual (tecla shift, tecla control, dejando pulsado el click -o el
dedo en pantalla :-) y moviendose por varias filas) se complica
bastante y el código empieza a hacerse muy rebuscado, y eso a la larga
suele dar problemas.

Claro, que ahora que lo dices, quizas enviando un sendkeys cuele.
Uhmmm, lo voy a investigar.

Muchas gracias y Feliz Navidad

Hola, Carlos:

Si he entendido bien, lo que tienes que hacer para que la nueva fila
seleccionada no te elimine las anteriormente seleccionadas, es mantener
pulsada la tecla «Control» mientras seleccionas con el ratón otras filas
cualquiera. Ese ha sido siempre el comportamiento de todos los controles del
tipo cuadrícula o Grid, y al que la mayoría de usuarios se encuentra
acostumbrado, cuando desean seleccionar varias filas no consecutivas.

Un saludo y ¡Feliz Navidad!

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.
Respuesta Responder a este mensaje
#3 SoftJaén
25/12/2006 - 18:31 | Informe spam
"Carlos Gómez" escribió:

El problema reside en que el programa va a ser usado tanto
en pantalla 'convencional' y pantalla tactil, por lo que el uso
del teclado no puede ser -en general- estrictamente necesario, ...



No he programado nunca para pantallas táctiles, pero juraría que en alguna
que otra ocasión, he visto a usuarios de ese tipo de pantallas, hacer uso
conjunto del teclado y del dedo índice, por lo que para el caso que nos
ocupa, entiendo que habría que diferenciar entre seleccionar una fila, o
bien, un conjunto de filas, y esa diferencia es la que hace que tengamos que
pulsar la tecla Control para seleccionar varias filas. ¿Se puede pulsar la
tecla Control mientras el usuario selecciona con el dedo una fila del
control DataGridView?

La pregunta realmente es si se puede modificar ese comportamiento.
Porque aunque lo he simulado mediante código ...



Para cambiar el comportamiento predeterminado, me imagino que habrá que
recurrir a código fuente, pero por ahora no se me ocurre nada en lo que te
pueda ayudar.

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.
Respuesta Responder a este mensaje
#4 Carlos Gómez
25/12/2006 - 20:07 | Informe spam
SoftJaén ha escrito:

No he programado nunca para pantallas táctiles, pero juraría que en alguna
que otra ocasión, he visto a usuarios de ese tipo de pantallas, hacer uso
conjunto del teclado y del dedo índice, por lo que para el caso que nos
ocupa, entiendo que habría que diferenciar entre seleccionar una fila, o
bien, un conjunto de filas, y esa diferencia es la que hace que tengamos que
pulsar la tecla Control para seleccionar varias filas. ¿Se puede pulsar la
tecla Control mientras el usuario selecciona con el dedo una fila del
control DataGridView?


Una pantalla táctil funciona exactamente igual que un ratón, solo que
(a nivel de hardware) el posicionamiento es absoluto y no relativo. Por
ese motivo no hay que ir arrastrando el dedo por la pantalla,
simplemente le das donde quieres y el puntero del ratón se posiciona
allí de forma automatica.
De hecho, las pantallas táctiles antiguas se hacían artesanalmente
mediante una rejilla que se ponia entre la pantalla del monitor y la
carcasa del monitor, y esta se conectaba al puerto serie como si fuera
un ratón. Es más, el conector tenía una toma extra para ratón ps2 o
serie.

Por tanto, si se puede hacer uso del teclado en convinación con la
pantalla táctil. Otro tema (que es el del desarrollo que estoy
realizando) es que las pantallas táctiles tengan teclado, que no es el
caso. Aquí los terminales con pantalla táctil solo realizan capturas
de datos mediante códigos de barras o manualmente a fuerza de
comboBoxes y similares. El uso de teclado virtual solo está previsto
en unos pocos formularios.



> La pregunta realmente es si se puede modificar ese comportamiento.
> Porque aunque lo he simulado mediante código ...

Para cambiar el comportamiento predeterminado, me imagino que habrá que
recurrir a código fuente, pero por ahora no se me ocurre nada en lo que te
pueda ayudar.




Eso era lo que me temía.

Bueno, gracias por todo
Respuesta Responder a este mensaje
#5 Carlos Gómez
26/12/2006 - 22:08 | Informe spam
Tu comentario de pulsar la tecla control me dio la clave. Hay que hacer
uso de la API para mantener la tecla CTRL pulsada:

API para el teclado:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)

ahora, gracias a la API, podemos mantener la tecla ctrl pulsada
mientras el usuario trabaja:

Al entrar en el datagrid, mandamos la pulsación de la tecla control
(17)
Private Sub DataGridView1_MouseEnter(ByVal sender As Object, _
ByVal e As
EventArgs) _
Handles DataGridView1.MouseEnter
Call keybd_event(17, 0, 0, 0)
End Sub

Al salir del datagridView, liberamos la tecla control:
Private Sub DataGridView1_MouseLeave(ByVal sender As Object, _
ByVal e As
System.EventArgs) _
Handles DataGridView1.MouseLeave
Call keybd_event(17, 0, 2, 0)
End Sub

Solo comentar que ejecutar el programa desde el IDE no se puede porque
se para por problemas con la pila.

Muchisimas gracias por la idea
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida