none
Ayuda con DataGridView (CellEndEdit) VB.NET RRS feed

  • Pregunta

  • Hola a Todos:

    Necesito detectar cuando estoy editando una celda de la grilla y termino con la tecla ESC, para que, de alguna forma, no se ejecute el código del evento CellEndEdit. (VB.NET)

    Alo así como sigue...

    Private Sub dgv_CellEndEdit(...).....

        Presioné la tecla ESC --> Exit Sub

        Calcular_Totales()

    End Sub

    Muchas Gracias


    pev

    miércoles, 13 de marzo de 2019 0:43

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    miércoles, 13 de marzo de 2019 17:49
    Moderador
  • Puedes usar esta clase que crea un Hook:

    Imports System.Security
    
    Imports System.Runtime.InteropServices
    
    Imports Microsoft.Win32.SafeHandles
    
    Imports System.Runtime.ConstrainedExecution
    
    Public Class Hook
        Implements IDisposable
    
        Private Shared hookHandle As SafeHookHandle
    
        Private keyToMonitor As Keys
    
        Public Event KeyPressed()
    
        Private Delegate Function LowLevelKeyboardProcDelegate( _
            ByVal nCode As Integer, ByVal wParam As IntPtr, _
            ByVal lParam As IntPtr) As IntPtr
    
        Public Sub New(ByVal keyToMonitor As Keys)
            Me.keyToMonitor = keyToMonitor
            If hookHandle IsNot Nothing Then Throw New InvalidOperationException("El hook ya existe.")
            hookHandle = SetHook(AddressOf HookCallback)
            If hookHandle.IsInvalid Then Throw New System.ComponentModel.Win32Exception
        End Sub
    
        Private Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    
            ' Función llamada al pulsar una tecla
    
            Const WM_KEYDOWN As Integer = &H100
    
            If nCode >= 0 AndAlso (wParam.ToInt32 = WM_KEYDOWN) Then
    
                Dim vkCode As Integer = Marshal.ReadInt32(lParam)
    
                If vkCode = keyToMonitor Then
                    RaiseEvent KeyPressed()
                End If
    
            End If
    
            Return NativeMethods.CallNextHookEx(hookHandle, nCode, wParam, lParam)
    
        End Function
    
        Private Function SetHook(ByVal callback As LowLevelKeyboardProcDelegate) As SafeHookHandle
    
            Const WH_KEYBOARD_LL As Integer = 13
            Return NativeMethods.SetWindowsHookEx(WH_KEYBOARD_LL, callback, _
                Nothing, 0)
    
        End Function
        <SuppressUnmanagedCodeSecurity()> _
        Private Class NativeMethods
    
            Private Const user32 As String = "user32.dll"
    
            ' Crea el hook.
            <DllImport("user32")> _
            Public Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProcDelegate, _
                ByVal hMod As IntPtr, ByVal dwThreadId As Integer) As SafeHookHandle
    
            End Function
    
            ' Libera el hook.
            <DllImport("user32.dll")> _
            <ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)> _
            Public Shared Function UnhookWindowsHookEx(ByVal hhk As SafeHookHandle) As <MarshalAs(UnmanagedType.Bool)> Boolean
    
            End Function
    
            <DllImport("user32.dll")> _
            Public Shared Function CallNextHookEx(ByVal hhk As SafeHookHandle, ByVal nCode As Integer, ByVal wParam As IntPtr, _
                ByVal lParam As IntPtr) As IntPtr
    
            End Function
    
    
        End Class
    
    
    
        Public Class SafeHookHandle
            Inherits SafeHandle
    
            Private Sub New()
                MyBase.New(IntPtr.Zero, True)
            End Sub
    
            Public Overrides ReadOnly Property IsInvalid() As Boolean
                Get
                    Return Me.handle = IntPtr.Zero
                End Get
            End Property
    
            Protected Overrides Function ReleaseHandle() As Boolean
                Return NativeMethods.UnhookWindowsHookEx(Me)
            End Function
        End Class
    
        Private disposedValue As Boolean = False        
    
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    
            If Not Me.disposedValue Then
    
                If hookHandle IsNot Nothing Then
    
                    If hookHandle.IsInvalid = False Then
    
                        If hookHandle.IsClosed = False Then
    
                            hookHandle.Dispose()
                            hookHandle = Nothing
    
                        End If
                    End If
                End If
            End If
    
            Me.disposedValue = True
    
        End Sub
    
    #Region " IDisposable Support "
    
        Public Sub Dispose() Implements IDisposable.Dispose
    
            Dispose(True)
    
            GC.SuppressFinalize(Me)
    
        End Sub
    
    #End Region
    
    End Class
    

    Y crear el hook haciendo esta declaración a nivel de formulario:

     Private WithEvents hook As New Hook(Keys.Escape)

    Debes crear este módulo que se llamará cuando pulse la tecla Escape:

    Private Sub hook_KeyPressed() Handles hook.KeyPressed

        MsgBox("Ha pulsado Escape")

    End Sub


    Saludos, Javier J


    jueves, 14 de marzo de 2019 13:00