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