lunes, 1 de febrero de 2010

AutoCompletar TextBox desde base de datos


Hay que tener en cuenta que para utilizar esta opción, debes asignar las siguientes propiedades:
AutoCompleteMode: que sirve para indicar cómo queremos que se muestren los datos que encuentra mientras se escribe en el control.
AutoCompleteSource: que sirve para indicarle de dónde se obtendrán los datos que se usarán mientras se escribe.
En este ejemplo se utiliza AutoCompleteSource asignado a CustomSource debido a que la fuente de
datos la obtenemos desde una ruta personalizada.
Image
En el evento Load del formulario, se llama a la función AutoCompletar como se muestra debajo, asignándole el control TextBox.
 
Elementos de importacion:


Imports System.Data.SqlClient
Private Sub
Form1_Load(
ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AutoCompletar(
Me.TextBox1)

End Sub


Esta es la función AutoCompletar que se deberá utilizar asignándole el control TextBox.

Public Function AutoCompletar(ByVal Control As TextBox) As AutoCompleteStringCollection
Dim Coleccion As New AutoCompleteStringCollection

Dim Comando As String

Comando = "SELECT Nombre FROM Clientes ORDER By Nombre"
'Creamos una nueva cadena de coneccion

Using Coneccion As New SqlConnection(My.Settings.Coneccion)
Dim Ejecutar As New SqlClient.SqlCommand(Comando, Coneccion)

'Abrimos la coneccion

Coneccion.Open()
Dim Lector As SqlDataReader = Ejecutar.ExecuteReader()

' Realizamos un Loop mientras se est‚ leyendo.
While
Lector.Read()

Coleccion.AddRange(
New String()
{Lector(0)})


End While
'Cerramos el SqlReader
Lector.Close()

'Cerramos la coneccion
Coneccion.Close()

End Using
'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
With Control
.AutoCompleteMode = AutoCompleteMode.Suggest

.AutoCompleteSource = AutoCompleteSource.CustomSource

.AutoCompleteCustomSource = Coleccion

End With
'Devolvemos los datos recuperados de la base de datos
Return
Coleccion


End Function

22 comentarios:

  1. excelente aporte amnigo
    ahora si pudieras poner un ejemplo de busqueda pero que busque en cualquier posicion osea si pongo juan y el sujeto se llama jose juan lo encuentre o lo desplege

    ResponderEliminar
  2. muy bueno, excelente gracias por compartir me funcionó correctamente, lo con bd acces.

    ResponderEliminar
  3. tengo visual net 2005 y me tira un error en esta linea My.Settings.Coneccion) , me dice que
    Error 1 'coleccion' no es un miembro de 'WindowsApplication2.My.MySettings'. tenes idea de por que puede ser?

    ResponderEliminar
  4. Rspta: Creaste tu cadena de conexion alli no lo especifique perdon por la omision

    ResponderEliminar
  5. perdon por la ignorancia pero no entiendo lo que me queres decir

    ResponderEliminar
  6. o sea cual es la solucion, se me esta quemadno la cabeza perdon si la pregunta es muy tarada. Yo pense que al ser una base de datos creada en acces quiza ese era el problema

    ResponderEliminar
  7. Me refiero a q si haz creado una cadena de conexion para tu base de datos en tu caso con access seria algo asi

    Imports System.Data.OleDb
    //cambias la primera linea por la que en mi caso
    puse imports system.data.sqlclient

    luego vas a crear la sgte cadena de conexion
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PRODELAC.mdb"

    me disculpo por no explicarte muy bien en este momento ya q ahora estoy algo ocupado si esperas mañana a primera hora encontraras una solucion para tu caso de access. Estoy en una reunión

    ResponderEliminar
  8. seria la ruta de donde esta almacenada mi base de datos?

    ResponderEliminar
  9. ups perdon, no jodo mas. gracias por el aporte

    ResponderEliminar
  10. realiza varios cambios el primero de la primera linea:
    Imports System.Data.OleDb
    y el segundo cambio seria la linea q dice
    using conexion ...
    por esto

    Conexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=el nombre de la ruta de tu bd en access "

    Coneccion = New OleDbConnection(Conexion)

    tercer cambio
    dim ejecutar as ...
    dim ejecutar as new oledbcommandbuilder (Comando,coneccion)

    ResponderEliminar
  11. ultimo cambio en dim lector as ...
    cambio por
    dim lector as OleDBDataReader = ejecutar.ExecuteReader()
    y me dices si eso soluciona tu problema espero no haberme equivocado con lo apurado q escirbo jejeje

    ResponderEliminar
  12. Hola nuevamente yo, la verdad que no anda no se que mas hacerle. te pego el codigo....
    Dim Coleccion As New AutoCompleteStringCollection

    Dim Comando As String

    Comando = "SELECT Nombre FROM Clientes ORDER By Nombre"
    'Creamos una nueva cadena de coneccion

    Dim ubicacion As String
    ubicacion = Application.StartupPath
    Dim conexion As String = "Data Source =" & ubicacion & "\PRUEBA.mdb"
    conexion &= ";Provider = microsoft.Jet.Oledb.4.0;"
    Dim Coneccion As OleDb.OleDbConnection = New OleDbConnection(conexion)

    Dim ejecutar As New OleDbCommandBuilder(Comando, Coneccion)

    'Abrimos la coneccion

    Coneccion.Open()
    Dim lector As OleDbDataReader = ejecutar.ExecuteReader()

    ' Realizamos un Loop mientras se est‚ leyendo.
    While Lector.Read()
    Coleccion.AddRange(New String() {Lector(0)})
    End While
    'Cerramos el SqlReader
    Lector.Close()

    'Cerramos la coneccion
    Coneccion.Close()

    'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
    With Control
    .AutoCompleteMode = AutoCompleteMode.Suggest

    .AutoCompleteSource = AutoCompleteSource.CustomSource

    .AutoCompleteCustomSource = Coleccion

    End With
    'Devolvemos los datos recuperados de la base de datos
    Return Coleccion()

    ResponderEliminar
  13. me tira error en dim ejecutar..... me dice(error de sobrecarga por que ninguna de las funciones new acepta este argumento..

    ejecutar.executereader()....me dice(no es un miembrode system.data.oledb.oledbcommandbuilder}

    return collecion()...me dice(no se ha especificado ningun argumento para el parametro index

    nuevamente perdon pero ya me saturo tdoo esto

    ResponderEliminar
  14. Hazlo asi y avisame q fue

    Imports System.Data.OleDb
    Private Sub
    Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AutoCompletar(Me.TextBox1)

    End Sub


    Esta es la función AutoCompletar que se deberá utilizar asignándole el control TextBox.

    Public Function AutoCompletar(ByVal Control As TextBox) As AutoCompleteStringCollection
    Dim Coleccion As New AutoCompleteStringCollection

    Dim Comando As String

    Comando = "SELECT Nombre FROM Clientes ORDER By Nombre"
    'Creamos una nueva cadena de coneccion

    Conexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=el nombre de la ruta de tu bd en access "

    Coneccion = New OleDbConnection(Conexion)
    Dim Ejecutar As New OleDbCommand(Comando, Coneccion)

    'Abrimos la coneccion

    Coneccion.Open()
    Dim Lector As OleDbDataReader = Ejecutar.ExecuteReader()

    ' Realizamos un Loop mientras se est‚ leyendo.
    While
    Lector.Read()
    Coleccion.AddRange(New String()
    {Lector(0)})

    End While
    'Cerramos el SqlReader
    Lector.Close()

    'Cerramos la coneccion
    Coneccion.Close()

    End Using
    'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
    With Control
    .AutoCompleteMode = AutoCompleteMode.Suggest

    .AutoCompleteSource = AutoCompleteSource.CustomSource

    .AutoCompleteCustomSource = Coleccion

    End With
    'Devolvemos los datos recuperados de la base de datos
    Return
    Coleccion

    End Function



    'Ajustamos el control TextBox o ComboBox para recibir los datos de la siguiente manera.
    With Control
    .AutoCompleteMode = AutoCompleteMode.Suggest

    .AutoCompleteSource = AutoCompleteSource.CustomSource

    .AutoCompleteCustomSource = Coleccion

    End With
    'Devolvemos los datos recuperados de la base de datos
    Return Coleccion()

    ResponderEliminar
  15. ME TIRA UN ERROR EN EL RETURN, ME DICE QUE NO SE ESPECIFICO NINGUN ARGUMENTO PARA EL PARAMETRO PARA EL INDEX

    ResponderEliminar
  16. ok ya revise el codigo y vi tu error elimina los parentesis q te sales en return coleccion y algo mas en la propiedad autocompletesource del textbox cambiala a customsource y eso debe hacer q te corra el programa

    ResponderEliminar
  17. muy chido gracias!!! salu2 desde Durango mexico
    PURO DURANGO!!!!

    ResponderEliminar
  18. Buneas Tardes a todos,

    Imposible en Access, no consigo que funcione...

    Alguién sabe algo???

    Gracias.

    ResponderEliminar
  19. Hola Hermano , Excelente codigo ,pero si quisiera usarlo para todos los campos de mi formulario, como hago porque seria un tedio hacerlo para cada uno de los texto Box.

    ResponderEliminar
  20. En visual Basic 6.0 lo hacia pero en el evento Change de cada Text Box pero esto no resulta Con la propiedad collection
    Disculpa por la pregunta

    ResponderEliminar
  21. GRACIAS QUE BUEN APORTE MUY SIMPLE Y SE ENTIENDE A LA PERFECCION
    SALUDOS

    ResponderEliminar