none
Consultar datos aa una base de datos desde una celda de la primera columna y mostrar en datgridview en la misma fila de la siguiente colum2, colum 3 ect al precionar enter

    Pregunta

  • Buen tardes necesito ayuda si alguien me lo puede ayudar.

    Requiero un código de ejemplo como puedo mostrar datos al consultar en una base de datos presionando enter y que me muestre  en una misma fila de un datagridview en caso de existir ir a la siguiente columna en caso de no haber salir mensaje

    Esperando una ayuda desde ya muchas gracias

    sábado, 3 de diciembre de 2016 22:31

Respuestas

  • Hola rolita36,

    Aunque no mencionas que base de datos estás utilizando, según tu historial de preguntas al parecer usas Access (OleDB).

    Solo tendrías que utilizar el evento EditingControlShowing y convertir la celda en un TextBox para poder usar el evento KeyPress y detectar si presiona Enter o no.

    Algo como :

    Private Sub DataGridView1_EditingControlShowing(sender As ..... 
        RemoveHandler CType(e.Control, TextBox).KeyPress, AddressOf detectarEnter
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf detectarEnter
    End Sub

    - Creamos el Handler para ese evento :

    Private Sub detectarEnter(sender As Object, e As KeyPressEventArgs)
        If e.KeyChar = Convert.ToChar(Keys.Enter) Then  'Si es la tecla Enter
    
            'Obtiene la fila actual
            Dim row = DataGridView1.CurrentRow
    
            'Obtiene el valor ingresado de la columna 1, posición 0
            Dim valor As String = row.Cells(0).Value.ToString()
    
            'Mandamos el valor y el índice de la fila
            obtenerDatos(valor, row.Index)
        End If
    End Sub

    Y el método que buscará el registro según el valor digitado.

    Public Sub obtenerDatos(ByVal valor As String,
                           ByVal index As Integer)
        Try
            Using con As New OleDbConnection("MiCadenaConexion")
                con.Open()
    
                Dim query = "Select campo1, campo2 from miTabla where id = ?"
    
                Dim cmd As New OleDbCommand(query, con)
                cmd.Parameters.AddWithValue("@id", valor)
    
                Dim reader As OleDbDataReader = cmd.ExecuteReader
    
                'Si hay resultado
                If reader.HasRows Then
                    If reader.Read() Then  'Leemos la fila
                        With DataGridView1
                            .Rows(index).Cells(1).Value = reader("campo1").ToString() 'Columna 2 del DGV
                            .Rows(index).Cells(2).Value = reader("campo2").ToString() 'Columna 3 del DGV
                        End With
                    End If
                Else
                    MessageBox.Show("El valor no produjo resutados!!!")
                End If
    
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Teniendo el índice de la fila en la que se produce el evento tienes que cambiar el .Value de las otras celdas.

    Otra forma sería utilizar el evento CellEndEdit, el cual se produce cuando se termina de editar la celda :

    Private Sub DataGridView1_CellEndEdit(sender .....
        'Si es la columna 1 (posición 0)
        If e.ColumnIndex = 0 Then
    
            'Obtiene el valor ingresado de la columna 1, posición 0
            Dim valor = CType(sender, DataGridView).Rows(e.RowIndex).Cells(0).Value.ToString()
    
            'Mandamos el valor y el índice de la fila
            obtenerDatos(valor, e.RowIndex)
        End If
    End Sub

    Y el método 'obtenerDatos(...)' sería el mismo.

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    sábado, 3 de diciembre de 2016 23:19

Todas las respuestas

  • Hola rolita36,

    Aunque no mencionas que base de datos estás utilizando, según tu historial de preguntas al parecer usas Access (OleDB).

    Solo tendrías que utilizar el evento EditingControlShowing y convertir la celda en un TextBox para poder usar el evento KeyPress y detectar si presiona Enter o no.

    Algo como :

    Private Sub DataGridView1_EditingControlShowing(sender As ..... 
        RemoveHandler CType(e.Control, TextBox).KeyPress, AddressOf detectarEnter
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf detectarEnter
    End Sub

    - Creamos el Handler para ese evento :

    Private Sub detectarEnter(sender As Object, e As KeyPressEventArgs)
        If e.KeyChar = Convert.ToChar(Keys.Enter) Then  'Si es la tecla Enter
    
            'Obtiene la fila actual
            Dim row = DataGridView1.CurrentRow
    
            'Obtiene el valor ingresado de la columna 1, posición 0
            Dim valor As String = row.Cells(0).Value.ToString()
    
            'Mandamos el valor y el índice de la fila
            obtenerDatos(valor, row.Index)
        End If
    End Sub

    Y el método que buscará el registro según el valor digitado.

    Public Sub obtenerDatos(ByVal valor As String,
                           ByVal index As Integer)
        Try
            Using con As New OleDbConnection("MiCadenaConexion")
                con.Open()
    
                Dim query = "Select campo1, campo2 from miTabla where id = ?"
    
                Dim cmd As New OleDbCommand(query, con)
                cmd.Parameters.AddWithValue("@id", valor)
    
                Dim reader As OleDbDataReader = cmd.ExecuteReader
    
                'Si hay resultado
                If reader.HasRows Then
                    If reader.Read() Then  'Leemos la fila
                        With DataGridView1
                            .Rows(index).Cells(1).Value = reader("campo1").ToString() 'Columna 2 del DGV
                            .Rows(index).Cells(2).Value = reader("campo2").ToString() 'Columna 3 del DGV
                        End With
                    End If
                Else
                    MessageBox.Show("El valor no produjo resutados!!!")
                End If
    
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Teniendo el índice de la fila en la que se produce el evento tienes que cambiar el .Value de las otras celdas.

    Otra forma sería utilizar el evento CellEndEdit, el cual se produce cuando se termina de editar la celda :

    Private Sub DataGridView1_CellEndEdit(sender .....
        'Si es la columna 1 (posición 0)
        If e.ColumnIndex = 0 Then
    
            'Obtiene el valor ingresado de la columna 1, posición 0
            Dim valor = CType(sender, DataGridView).Rows(e.RowIndex).Cells(0).Value.ToString()
    
            'Mandamos el valor y el índice de la fila
            obtenerDatos(valor, e.RowIndex)
        End If
    End Sub

    Y el método 'obtenerDatos(...)' sería el mismo.

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    sábado, 3 de diciembre de 2016 23:19
  • Muchas gracias!!

    Ya lo voy a probar luego le comento que paso.

    lunes, 5 de diciembre de 2016 6:07