Buscar un texto en una columna y seleccionar los coincidentes en un DGV

<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,

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

Guardar el resultado de una vista en una tabla

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,