Autocompletando columnas en un DataGridView

<Pregunta>
Estoy desarrollando una TPV, y he visto muchos ejemplos donde existe un texbox para ingresar el codigo o el producto y despues agregarle al datagrid. Mi pregunta es la siguiente:
Existe la forma de escribir directamente en la grilla y que a medida de ingresar las letras me autocomplete el nombre del producto y luego con enter me trae los otros datos (codigo,precio,etc)?
Saludos

<Respuesta>

Public Class Form1

    Private Articulo As New DataTable(«Articulos»)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       

        ‘ Simular tabla Articulos

       

        Articulo.Columns.Add(«Codigo»)

        Articulo.Columns.Add(«Descripcion»)

        Articulo.Columns.Add(«Precio»)

        Articulo.Rows.Add(«001», «Resistencia 100oh», «0,15»)

        Articulo.Rows.Add(«002», «Transistor 2n2234», «1,00»)

        Articulo.Rows.Add(«003», «Microprocesador Z80», «5,40»)

        Articulo.Rows.Add(«004», «UART 16C450», «3,45»)

        Articulo.Rows.Add(«001», «Resistencia 200oh», «0,12»)

        Articulo.Rows.Add(«002», «Transistor 2n2222», «1,22»)

       

        ‘Fijar la clave principal para las busquedas

        Dim Claves(0) As DataColumn

        Claves(0) = Articulo.Columns(«Descripcion»)

        Articulo.PrimaryKey = Claves

       

        ‘Crear la lista de cadenas para el autocompletado

        For Each nombre In Articulo.Rows

            CadenasAutocompletado.Add(nombre(«Descripcion»))

        Next

        ‘Dar formato a la vista de nuestro DGV

        Me.DataGridView1.Columns.Add(«Codigo», «Codigo»)

        Me.DataGridView1.Columns.Add(«Descripcion», «Descripcion»)

        Me.DataGridView1.Columns.Add(«Precio», «Precio»)

    End Sub

   

    ‘Al editar la celda Descripcion

    Private CadenasAutocompletado As New AutoCompleteStringCollection

    Private Sub ControlEdicion(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

        If DataGridView1.CurrentCell.ColumnIndex = 1 Then

            DirectCast(e.Control, TextBox).AutoCompleteMode = AutoCompleteMode.SuggestAppend

            DirectCast(e.Control, TextBox).AutoCompleteSource = AutoCompleteSource.CustomSource

            DirectCast(e.Control, TextBox).AutoCompleteCustomSource = CadenasAutocompletado

        End If

    End Sub

   

    ‘ Completar las columnas de Codigo/Precio al finalizar la edicion

    Private Sub FinDeEdicion(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit

        ‘Añadir aqui las validaciones necesarias

        Try

            Dim _Articulo As DataRow = Articulo.Rows.Find(Me.DataGridView1(e.ColumnIndex, e.RowIndex).Value)

            Me.DataGridView1(«Codigo», e.RowIndex).Value = _Articulo(«Codigo»)

            Me.DataGridView1(«Precio», e.RowIndex).Value = _Articulo(«Precio»)

        Catch ex As Exception

            ‘…. Accion en caso de excepcion

        End Try

    End Sub

End Class

12 pensamientos en “Autocompletando columnas en un DataGridView”

  1. Que tal, trate de hacer un cambio en el metodo FinDeEdicion, introduciendo una columna independiente (cantidad) que no se encuentra en mi tabla de origen (articulo), y me da un error «Referencia a objeto no establecida como instancia de un objeto.»
    Que estoy haciendo mal?
    gracias

  2. Hola Jorge,
    El problema es que desconozco como realizaste los bindings en tu tabla.

    Si te parece puedes contactar conmigo directamente a traves de opcion [Contac] en el principio de pagina margen derecho.

    Saludos,
    Pep Lluis,

  3. hola tengo una aplicacion similar y parece que es lo que necesito para el proyeto final
    la cosa es que en mi caso tengon un datagrid a la cual le he asignado columnas header desde modo diseño con los nombres de : cantidad, codigo, descripcion y precio lo que te pido por favor me ayudes es mostrarme el camino para POOder llenar los campos de descriocion y precio al escribir el codigo en la una grilla por favor ayuuuuuuuuuuuuuuudame….

  4. Hola Noe,
    Intentare ayudarte dentro de mis posibilidades. La idea es entender que nesitas… cuando dices poder llenar los campos al escribir el codigo en una grilla, te estas refiriendo a enlazarlo?
    En todo caso contacta desde la opcion [Contact] y continuamos la conversacion.

    Saludos,
    Pep Lluis,

  5. Buen dia me tira un error en esta linea, donde declaraste la variable nombre, o mejor dicho cual es su funcion en el For, de antemano muchas gracias por la respuesta.

    For Each nombre In Articulo.Rows
    CadenasAutocompletado.Add(nombre(«Descripcion»))
    Next

  6. tengo una duda, en esta parte, «nombre» que tipo de variable es: de antemano muchas gracias por la respuesta

    ‘Crear la lista de cadenas para el autocompletado
    For Each nombre In Articulo.Rows
    CadenasAutocompletado.Add(nombre(«Descripcion»))
    Next

  7. Hola will,
    Si tienes las opciones de compilacion ‘explicid’ ‘strict’ e ‘infer’ por defecto, si no me equivoco el nombre toma el tipo de ‘Object’.

    Saludos,
    Pep Lluis,

  8. super ejemplo
    gracias por la ayuda

    si podes tambien estoy interezado en hacer q en un datagridview cuyas celdas todas sean tipo texto
    cuando me situo en una celda se combierta en un combobox similar a lo q hace el sqlserver al crear un atrbuto

  9. Buenos dias, En mi caso estoy utilizando una base de datos con mysql, y me funcionaba todo bien, este mismo metodo, pero ocurria q cada vez q editaba cualquier celda, esto q ya habia dejado las condiciones si estaba en la columna x, pues q ejecutara el autocompledado, bueno no canzar para los q tengan el problema q aun con condicion le autocompleta en todas las columnas, lo unico q tienen q hacer es limpiar CadenasAutocompletado.clear cuando no sea una columna de autocompleado al final y al principio llamar con un metodo la carga de la misma coleccion a la variable CadenasAutocompletado.. saludos..

  10. Private Sub Contribuyentes_comercio_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Cadena_Conexion1 = «Data Source=localhost;» & _
    «Database=sacdb;Allow Zero Datetime=True;Convert Zero Datetime=True; » & _
    «User Id=root;Password=clave»
    MySqlConexion1 = New MySql.Data.MySqlClient.MySqlConnection(Cadena_Conexion1)
    ‘cargar todo los datos relacionados
    Me.InscripcionesDS.Clear()
    Dim MysqlDa As New MySqlDataAdapter
    MysqlDa.SelectCommand = _
    New MySqlCommand(«SELECT * FROM contribuyentes», MySqlConexion1)
    ‘ New MySqlCommand(«SELECT * FROM contribuyentes Where id_Pobladores='» & VG.iid_poblador & «‘», MySqlConexion1)
    MysqlDa.Fill(InscripcionesDS, «contribuyentes»)

    Me.CargarAutocompletado()
    End Sub

    Sub CargarAutocompletado()
    Dim MysqlDa1 As New MySqlDataAdapter
    MysqlDa1.SelectCommand = _
    New MySqlCommand(«SELECT * FROM barrios», MySqlConexion1)
    MysqlDa1.Fill(PobladoresDS, «barrios»)
    Me.BarrioComboBox.SelectedValue = Me.Id_barrioTextBox.Text
    Conexion.MySqlConexion1.Close()
    ‘rellena datos para autocompletado
    Dim cmd As New MySqlCommand(«Select codigo FROM ingresos», MySqlConexion1)
    Dim dr As MySqlDataReader
    MySqlConexion1.Open()
    dr = cmd.ExecuteReader
    Do While dr.Read
    scAutocomplete.Add(dr.GetString(0))
    Loop
    MySqlConexion1.Close()
    End Sub

    Private Sub DataGridView1_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
    Handles DataGridView1.EditingControlShowing
    If Me.DataGridView1.CurrentCell.ColumnIndex = 3 AndAlso TypeOf e.Control Is TextBox Then
    Me.CargarAutocompletado()
    With DirectCast(e.Control, TextBox)
    .AutoCompleteMode = AutoCompleteMode.SuggestAppend
    .AutoCompleteSource = AutoCompleteSource.CustomSource
    .AutoCompleteCustomSource = scAutocomplete
    MessageBox.Show(«»)
    End With
    Else
    scAutocomplete.Clear()
    End If
    End Sub
    Private Sub DataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
    End Sub

    consulten a: eomd.1983@gmail.com
    si tengo tiempo porque estoy en un proyecto les contesto….

Responder a noe garcia Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *