none
Para quienes tengan experiencia con objetos, porfa, consulta sobre control de las pulsaciones en las celdas del GridView RRS feed

  • Pregunta


  • LES EXPLICO LO QUE QUIERO:

    LES EXPLICO LO QUE QUIERO:

    Quiero limitar los caracteres de ingreso y saber si se presionó Enter o Tab o flecha, etc. durante la edición de las celdas de un control DataGridView.

    LES EXPLICO LO QUE TENGO:

    LES EXPLICO LO QUE TENGO:

    Hasta el momento investigando he podido limitar los caracteres que acepta cada celda de una columna del DataGridView, con esto:

    Dim WithEvents txtCelda As DataGridViewTextBoxEditingControl

    Private Sub dgvTabla_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles ctaTratamiento.EditingControlShowing

        txtCelda = TryCast(e.Control, DataGridViewTextBoxEditingControl)

      End Sub

       '*** Y así accedo a los eventos del texto, por ejemplo aquí se puede controlar las pulsaciones de tecla para las celdas del DataGridView:

      Private Sub txtCelda_KeyPress(sender As Object, e As KeyPressEventArgs) Handles

     End Sub

    De igual forma puedo acceder a otros eventos del control de texto que representa la celda como KeyDown o KeyUp.

    LES EXPLICO LO QUE ME FALTA:

    LES EXPLICO LO QUE ME FALTA:

    El problema es que durante la edición de una celda ninguno de los eventos anteriores me detecta la tecla INTRO, aunque puedo acceder al evento KeyDown, no la detecta, investigando creo que la solución está en lo que pego abajo pero no sé cómo empalmarlo con txtCelda (del código que pongo) y allí entra a tallar su auxilio.

    En lo que dice acá creo que está la solución de lo que me falta:

    "La clase DataGridViewTextBoxEditingControl es un tipo especializado de control TextBox que implementa la interfaz IDataGridViewEditingControl, permitiéndole ser hospedado en DataGridViewTextBoxCell cuando la celda se encuentra en modo de edición.

    EditingControlShowing para realizar la inicialización personalizada del control de edición cuando entra una celda en el modo de edición.DataGridViewEditingControlShowingEventArgs.CellStyle property rather than setting the properties of the control returned by the DataGridViewEditingControlShowingEventArgs.Control property." id="mt5">Para personalizar las características de presentación del control, establezca las propiedades del objeto devueltas por la propiedad DataGridViewEditingControlShowingEventArgs.CellStyle, en lugar de establecer las propiedades devueltas por la propiedad DataGridViewEditingControlShowingEventArgs.Control."

    y aquí hay una función que tiene relación con lo anterior:

     

    Public Function EditingControlWantsInputKey(ByVal key As Keys, _

            ByVal dataGridViewWantsInputKey As Boolean) As Boolean _

            Implements IDataGridViewEditingControl.EditingControlWantsInputKey

     

            ' Let the DateTimePicker handle the keys listed.

            Select Case key And Keys.KeyCode

                Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _

                    Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp

     

                    Return True

     

                Case Else

                    Return Not dataGridViewWantsInputKey

            End Select

     

        End Function

    Gracias por la paciencia de leer y ojalá tenga suerte y lea la pregunta uno de los expertos de este foro, que dicho sea de paso hay varios.



    • Editado James-2016 viernes, 5 de febrero de 2016 4:01
    viernes, 5 de febrero de 2016 4:00

Respuestas

  • agrega la siguiente clase

    Public Class DgvKeyPress
        Inherits DataGridView
        Protected Overrides Function ProcessDialogKey(keys As System.Windows.Forms.Keys) As Boolean
            Form1.prueba(keys)
            Return True
        End Function
    End Class

    en el archivo Form1.Designer.vb o en donde tengas tu grid

    Luego modificas el Me.DataGridView1 = New System.Windows.Forms.DataGridView() y pones Me.DataGridView1 = New DgvKeyPress()

    en la clase del Form1 creas una Public Sub, yo le puse prueba

    Public Sub prueba(key As Keys)
            If key = Keys.Enter Then
                MessageBox.Show("Presionaste Enter")
            End If
        End Sub

    ya con eso capturas todas las teclas, pero en este ejemplo solo se dispara el mensaje si presionas enter

    espero que esto si te sirva


    Att. Franklin Andino

    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 5:59
    viernes, 5 de febrero de 2016 6:34
  • solo cámbiale el return a false, una cosa mas

    cuando necesites realizar cambios a la pantalla deberas retornar a DataGridView

    Me.DataGridView1 = New DataGridView 'DgvKeyPress()

    al terminar los cambios en la pantalla lo pondrás nuevamente como

    Me.DataGridView1 = New DgvKeyPress()


    Att. Franklin Andino

    si te funciona no se te olvide dar en respuesta y puntuar


    • Editado Franklin Andino sábado, 6 de febrero de 2016 3:30
    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 6:07
    sábado, 6 de febrero de 2016 2:20
  • "James-2016" escribió:

    > El problema es que durante la edición de una celda ninguno de los eventos
    > anteriores me detecta la tecla INTRO, aunque puedo acceder al evento
    > KeyDown, no la detecta, investigando creo que la solución está en lo que
    > pego abajo pero no sé cómo empalmarlo con txtCelda (del código que pongo)
    > y allí entra a tallar su auxilio.
    >
    > En lo que dice acá creo que está la solución de lo que me falta:
    >
    > "La clase DataGridViewTextBoxEditingControl ...

    Hace ya unos cuantos años que escribí un artículo sobre ese "problema" que comentas, si se puede llamar así:

    Cómo detectar la tecla pulsada en una celda del control DataGridView

    No sé si ésta pregunta tiene algo que ver con otra que te acabo de responder sobre reemplazar la tecla Enter por la tecla Derecha.

    ¿Cómo anulo una tecla en este procedimiento y la reemplazo por otra?


    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.

    sábado, 6 de febrero de 2016 10:30
    Moderador

Todas las respuestas

  • mira si te sirve esto  

    Private Sub textbox1_keypress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = Convert.ToChar(Keys.Enter) Then
                MessageBox.Show("Presionaste Enter")
            End If
     End Sub


    Att. Franklin Andino

    viernes, 5 de febrero de 2016 4:30
  • No lo detecta de esa manera, lo mencioné al principio.
    viernes, 5 de febrero de 2016 5:05
  • agrega la siguiente clase

    Public Class DgvKeyPress
        Inherits DataGridView
        Protected Overrides Function ProcessDialogKey(keys As System.Windows.Forms.Keys) As Boolean
            Form1.prueba(keys)
            Return True
        End Function
    End Class

    en el archivo Form1.Designer.vb o en donde tengas tu grid

    Luego modificas el Me.DataGridView1 = New System.Windows.Forms.DataGridView() y pones Me.DataGridView1 = New DgvKeyPress()

    en la clase del Form1 creas una Public Sub, yo le puse prueba

    Public Sub prueba(key As Keys)
            If key = Keys.Enter Then
                MessageBox.Show("Presionaste Enter")
            End If
        End Sub

    ya con eso capturas todas las teclas, pero en este ejemplo solo se dispara el mensaje si presionas enter

    espero que esto si te sirva


    Att. Franklin Andino

    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 5:59
    viernes, 5 de febrero de 2016 6:34
  • Gracias, hice al pie de la letra lo que indica, funcionó en parte, ahora detecta la pulsación de Enter tal como se ve en la imagen que pone, el problema es que se deshabilito la funcionalidad, es decir cuando edito una celda y escribo no aparecen los caracteres en la celda, pero sí los detecta porque puedo hacer una condición y mostrar un mensaje a medida que voy presionando las teclas, qué puede estar ocurriendo?
    viernes, 5 de febrero de 2016 20:07
  • solo cámbiale el return a false, una cosa mas

    cuando necesites realizar cambios a la pantalla deberas retornar a DataGridView

    Me.DataGridView1 = New DataGridView 'DgvKeyPress()

    al terminar los cambios en la pantalla lo pondrás nuevamente como

    Me.DataGridView1 = New DgvKeyPress()


    Att. Franklin Andino

    si te funciona no se te olvide dar en respuesta y puntuar


    • Editado Franklin Andino sábado, 6 de febrero de 2016 3:30
    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 6:07
    sábado, 6 de febrero de 2016 2:20
  • "James-2016" escribió:

    > El problema es que durante la edición de una celda ninguno de los eventos
    > anteriores me detecta la tecla INTRO, aunque puedo acceder al evento
    > KeyDown, no la detecta, investigando creo que la solución está en lo que
    > pego abajo pero no sé cómo empalmarlo con txtCelda (del código que pongo)
    > y allí entra a tallar su auxilio.
    >
    > En lo que dice acá creo que está la solución de lo que me falta:
    >
    > "La clase DataGridViewTextBoxEditingControl ...

    Hace ya unos cuantos años que escribí un artículo sobre ese "problema" que comentas, si se puede llamar así:

    Cómo detectar la tecla pulsada en una celda del control DataGridView

    No sé si ésta pregunta tiene algo que ver con otra que te acabo de responder sobre reemplazar la tecla Enter por la tecla Derecha.

    ¿Cómo anulo una tecla en este procedimiento y la reemplazo por otra?


    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.

    sábado, 6 de febrero de 2016 10:30
    Moderador
  • Gracias, lo probé y también funciona.
    lunes, 8 de febrero de 2016 5:59
  • Gracias, efectivamente esta pregunta tiene relación con la otra.

    Créame que buscando en google ya había revisado ese interesante artículo. De hecho de su artículo pude aprender cómo acceder a los controles de texto que permiten editar las celdas me sirvió para limitar el ingreso de determinados caracteres, solo me faltaba cambiarle la dirección a INTRO en modo de edición pero con la ayuda de quienes han respondido y la suya particularmente ya está solucionado un escollo más.


    lunes, 8 de febrero de 2016 6:05