<Pregunta>
Que tal .. igual no sé si este comentario sea para es hilo, pero tengo un problema .. tengo un datagridview pero quiero agregar un textbox fuera del datagrid, para cuando empiece a escribir vaya buscando en el datagrid y que se vaya seleccionando, sé que para ese procedimiento se juega un poco con el datatable pero aún estoy perdido ... alguién tiene una sugerencia ..
Mil gracias
<Respuesta>
... Se me ocurre algo similar a esto.
Private Articulo As New DataTable("Articulos")
Private MIDGV As New DataGridView
Private MITXT As New TextBox
Private Sub Form1_Load() Handles MyBase.Load
'
' Simular tabla Articulos
'
Articulo.Columns.Add("Codigo")
Articulo.Columns.Add("Descripcion")
Articulo.Columns.Add("Precio")
Articulo.Rows.Add("001", "Resistencia 100ohms", "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("005", "Resistencia 200ohms", "0,12")
Articulo.Rows.Add("006", "Transistor 2n2222", "1,22")
'
' marco
Dim marcoDGV = New FlowLayoutPanel
marcoDGV.BorderStyle = BorderStyle.Fixed3D
marcoDGV.Width = Me.Width
marcoDGV.Height = Me.Height
' Añadir el marco con el DataGridView y textBox
marcoDGV.Controls.AddRange(New Control() {MIDGV, MITXT})
Me.Controls.Add(marcoDGV)
' Seleccionar el textbox
MITXT.Select()
' al cambiar el texto
AddHandler MITXT.TextChanged, AddressOf VerSeleccion
End Sub
' LINQ (Con VB9 'Visual Studio 2008')
' Mostrar la seleccion de los registros
' que contienen la seleccion del texto
' introducido en el textBox
Private Sub VerSeleccion()
MIDGV.DataSource = (From S In Articulo Where S.Item("Descripcion").ToString.Contains(MITXT.Text) _
Select Codigo = S.Item("Codigo"), _
Descripcion = S.Item("Descripcion") _
).ToList
End Sub
Saludos,
Pep Lluis,
<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
Respondiendo a una consulta de cómo copiar los registros seleccionados de una tabla origen a una nueva tabla, os dejo esta propuesta que espero sea de vuestra utilidad.
'
' Simular tabla Origen
'
Dim Origen As New DataTable("Maestro")
Origen.Columns.Add("Cliente")
Origen.Columns.Add("Nombre")
Origen.Rows.Add("001", "Jose Javier Garcia")
Origen.Rows.Add("002", "Jhon Smith Carter")
Origen.Rows.Add("003", "Pierre Bertran Janvier")
Origen.Rows.Add("004", "Jose Di Souza")
' Crear una Vista con todos los clientes cuyo nº sea inferior a 3
Dim Seleccion As New DataView(Origen, "Cliente < '003'", "Cliente", DataViewRowState.CurrentRows)
' Crear tabla Destino
Dim Destino As New DataTable("Duplicado")
' Llenar el destino con los resultados de la vista de datos
Destino = Seleccion.ToTable
' Visualizar... (...añadir a vuestro DataSet,..Actualizar...etc.)
Me.DataGridView1.DataSource = Destino
Saludos,
Pep Lluis,