<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
Gracias por la ayuda
lo implemento de inmediato
saludos
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
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,
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….
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,
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
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
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,
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
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..
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….
Excelente ejemplo. Muchas gracias