Вы находитесь на странице: 1из 12

Autocompletar en DataCombo al escribir

<Volver> - Anterior - Siguiente






Contenido
Descripcin
Autocompletar Datacombo usando la propiedad MatchEntry
Autocompletar con el mtodo Find
Relacionados






Descripcin
En esta pgina hay dos ejemplos para poder autocompletar mientras se escribe en un control DataCombo
El primer Cdigo lo hace utilizando la propiedad MatchEntry del DataCombo para poder autocompletar mientras se escribe en el
control. El segundo cdigo fuente, lo hace buscando con la propiedad Find del recordset, y seleccionando y autocompletando en
caso de coincidencias


1 - Autocompletar usando la propiedad MatchEntry
Esta propiedad tiene dos valores posibles ( dblBasicMatching y dblExtendedMatching).
La primera, al tipear sobre el DataCombo, se autocompletar por la primer letra presionada, por lo tanto si se vuelve a
presionar otra tecla seguida, la ignorar en la bsqueda de elementos de la lista. La segunda permite seguir autocompletando al
tipear, obviamente mientras haya coincidencias con lo que se tipea
El siguiente ejemplo, que utiliza la base de datos nwind.mdb instalada en el directorio de visual basic, carga en el control
DataCombo el campo "NombreCompaa" de la tabla proveedores.
En dicho campo, por poner un ejemplo, hay dos nombres de compaias que comienzan con la letra "P" ( Pavlota LTD.) y ( Pasta
Butini SRL).
Si la propiedad MatchEntry del DataCombo est en Extendida (dblExtendedMatching ) , y al presionar la letra "p", y luego la "a",
se autocompletar con el nombre de la compaia "Pavlota LTD." mostrando dicho valor.
Pero si luego presionamos la letra "s", se aucompletar con "Pasta Butini SRL"
Para poder utilizar este ejemplo, el control DataCombo debe tener la propiedad Style con el valor (2 - dbcDropDownList ) y esta
propiedad se debe asignar en tiempo de diseo ya que en tiempo de ejecucin es de solo lectura.

Controles
Dos controles ADODC
Un control DataGrid
Un Control DataCombo
Un CommandButton

formulario con los controles



Cdigo fuente en el formulario
Texto planoImprimir
1. Option Explicit
2.
3.
4. ' Botn que cambia la propiedad MatchEntry del control DataCombo
5. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
6. Private Sub Command1_Click()
7.
8. 'dblExtendedMatching
9. If DataCombo1.MatchEntry = dblBasicMatching Then
10. DataCombo1.MatchEntry = dblExtendedMatching
11. Command1.Caption = "Extended Matching"
12. Else
13. 'dblBasicMatching
14. DataCombo1.MatchEntry = dblBasicMatching
15. Command1.Caption = "Basic Matching"
16. End If
17. End Sub
18.
19. Private Sub Form_Load()
20.
21. Command1.Caption = "Extended Matching"
22. ' por defecto usa el autocompletar en modo ExtendedMatching
23. DataCombo1.MatchEntry = dblExtendedMatching
24. ' cadena de conexin para los dos controles ADODC
25. Dim ConnectionString As String
26. ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};" & _
27. "Dbq=C:\Archivos de programa\Microsoft Visual Studio\VB98\nwind.mdb;" & "Uid=;Pwd="
28.
29. ' Propiedades del Adodc 1
30. With Adodc1
31. .RecordSource = "SELECT NombreProducto,IdProducto,IdProveedor FROM Productos"
32. .ConnectionString = ConnectionString
33. .Refresh
34. .Visible = False
35. End With
36. ' Propiedades del Adodc 2 ( para el RowSource del dataCombo )
37. With Adodc2
38. .RecordSource = "SELECT NombreCompaa,IdProveedor FROM Proveedores"
39. .ConnectionString = ConnectionString
40. .Refresh
41. .Visible = False
42. End With
43.
44. ' Engancha el DataGrid
45. Set DataGrid1.DataSource = Adodc1
46.
47. ' Propiedades para el DataCombo
48. With DataCombo1
49. Set .DataSource = Adodc1
50. .DataField = "IdProveedor"
51. .BoundColumn = "IdProveedor"
52.
53. Set .RowSource = Adodc2
54. .ListField = "NombreCompaa"
55. End With
56.
57. Adodc1.Recordset.MoveFirst
58. DoEvents
59. End Sub


2 - Autompletar buscando en el recordset
Este otro ejemplo es muy diferente al anterior, ya que al momento de tipear, se busca en el recordset ( Mtodo Find ) a medida
que se escribe, y se selecciona y autocompleta la palabra con las propiedad SelStart y SelLenght del DataCombo entre otras
Formulario


El cdigo fuente utiliza un simple mdulo de clase.
Este mdulo tiene dos mtodos. Uno llamado Init y otro Autocompletar.
El primero permite indicar el control DataCombo y el recordset que utiliza el mismo y es el primero que se debe ejecutar . Por
ejemplo
ObjClase.Init DataCombo1, Adodc2.Recordset

El otro mtodo, se debe ejecutar en el evento KeyPress, envindole como parmetro el cdigo Ascii para que la funcin se
encargue de Autocompletar
Private Sub DataCombo1_KeyPress(KeyAscii As Integer)
Dim Encontrado As Boolean

Encontrado = ObjClase.Autocompletar(KeyAscii)

End Sub

Agregar al formulario los siguientes controles
1. Un control DataCombo ( DataCombo1 )
2. Un control DataGrid ( DataGrid1 )
3. Dos controles de Ado ( Adodc1 y Adodc2 )
4. Un mdulo de clase ( Class1 )
Nota: En este caso se utiliza la base de datos Nwind instalada en el Dir de vb6
Cdigo fuente en el formulario
Texto planoImprimir
1. Option Explicit
2.
3. ' variable para utilizar el mdulo de clase
4. Dim Obj As Class1
5.
6. Private Sub Form_Load()
7.
8. ' Neuva instancia de Class 1
9. Set Obj = New Class1
10.
11. ' cadena de conexin para los dos controles ADODC
12. Dim ConnectionString As String
13. ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};" & _
14. "Dbq=C:\Archivos de programa\Microsoft Visual Studio\VB98\nwind.mdb;" & "Uid=;Pwd="
15.
16. ' Propiedades del control Ado 1
17. With Adodc1
18. .RecordSource = "SELECT NombreProducto,IdProducto,IdProveedor FROM Productos"
19. .ConnectionString = ConnectionString
20. .Refresh
21. End With
22.
23. ' Propiedades del control Ado 2 ( para el Data Combo )
24. With Adodc2
25. .RecordSource = "SELECT NombreCompaa,IdProveedor FROM Proveedores"
26. .ConnectionString = ConnectionString
27. .Refresh
28. End With
29.
30. ' Carga el DataGrid
31. Set DataGrid1.DataSource = Adodc1
32.
33. ' DataCombo (Propiedades)
34. With DataCombo1
35. Set .DataSource = Adodc1
36. .DataField = "IdProveedor"
37. .BoundColumn = "IdProveedor"
38.
39. Set .RowSource = Adodc2
40. .ListField = "NombreCompaa"
41. End With
42.
43. Adodc1.Recordset.MoveFirst
44. DoEvents
45. End Sub
46.
47. Private Sub DataCombo1_GotFocus()
48. ' Le enva como parmetro el DataCombo y el recordset
49. Obj.Init DataCombo1, Adodc2.Recordset
50. End Sub
51.
52. Private Sub DataCombo1_KeyPress(KeyAscii As Integer)
53. Dim Encontrado As Boolean
54. ' funcin que autocompleta ( Le enva le cdigo Ascii )
55. Encontrado = Obj.Autocompletar(KeyAscii)
56.
57. Me.Caption = Encontrado
58.
59. End Sub
60.
61. Private Sub Form_Unload(Cancel As Integer)
62. ' Elimina la referencia del mdulo de clase
63. If Not Obj Is Nothing Then
64. Set Obj = Nothing
65. End If
66. End Sub
Cdigo fuente del mdulo de clase ( Class1 )
Texto planoImprimir
1. Option Explicit
2.
3. Private m_DataCombo As Object
4. Private m_Recordset As ADODB.Recordset
5. Private m_Texto_Actual As String
6.
7.
8. Public Function Init(DataCombo As Object, rs As Object)
9.
10. ' Referencia local para el control
11. Set m_DataCombo = DataCombo
12.
13. ' Copia del recordset que lo utiliza
14. Set m_Recordset = rs.Clone
15. m_Texto_Actual = ""
16.
17. End Function
18.
19. ' funcin que recibe el KeyAscii para autocompletar el control al escribir
20. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
21. Public Function Autocompletar(KeyAscii As Integer) As Boolean
22.
23. Dim buscar As Boolean ' flag
24. Dim m_ListField As String
25.
26. m_ListField = m_DataCombo.ListField
27.
28. ' Verifica que el campo sea de tipo texto
29. If m_Recordset(m_ListField).Type <> adVarChar Then
30. Autocompletar = False
31. Exit Function
32. End If
33.
34. If m_DataCombo.SelLength <> 0 Then
35. m_Texto_Actual = Left(m_DataCombo, m_DataCombo.SelStart)
36. End If
37.
38. buscar = True
39.
40. Select Case KeyAscii
41.
42. ' tecla retroceso
43. Case vbKeyBack
44. If m_Texto_Actual = "" Then
45. buscar = False
46. Else
47. m_Texto_Actual = Left(m_Texto_Actual, Len(m_Texto_Actual) - 1)
48. End If
49. KeyAscii = 0
50.
51. ' tecla Tabulador y enter
52. Case vbKeyTab, vbKeyReturn
53. buscar = False
54. m_DataCombo.SelStart = Len(m_DataCombo)
55. m_DataCombo.SelLength = 0
56. m_Texto_Actual = m_DataCombo
57. KeyAscii = 0
58.
59. ' tecla escape
60. Case vbKeyEscape
61. m_Texto_Actual = m_DataCombo
62. KeyAscii = 0
63. ' Tecla espacio
64. Case Is >= vbKeySpace
65. buscar = True
66. m_Texto_Actual = m_Texto_Actual & Chr(KeyAscii)
67. End Select
68.
69. If buscar And m_Texto_Actual <> "" Then
70.
71. With m_Recordset
72.
73. ' Si el campo no es de tipo texto sale de la funcin
74. If .Fields(m_ListField).Type <> adVarChar Then
75. Autocompletar = False
76. Exit Function
77. End If
78.
79. ' busca en el recordset
80. .Find m_ListField & " LIKE '" & m_Texto_Actual & "*'", , , 1
81.
82. If Not .EOF Then
83. ' Autocompleta
84. m_DataCombo = .Fields(m_ListField)
85. ' Selecciona el texto
86. m_DataCombo.SelStart = Len(m_Texto_Actual)
87. m_DataCombo.SelLength = 9999
88. 'retorna
89. Autocompletar = True
90. Else
91. ' No autocompleta
92. Autocompletar = False
93. m_DataCombo = m_Texto_Actual
94. m_DataCombo.SelStart = Len(m_Texto_Actual)
95. End If
96. End With
97.
98. KeyAscii = 0
99. Else
100. If m_Texto_Actual <> "" Then
101. KeyAscii = KeyAscii
102. Else
103. m_DataCombo = ""
104. End If
105. End If
106. 'Debug.Print m_Texto_Actual
107. End Function
108.
109. ' Termina el mdulo
110. Private Sub Class_Terminate()
111. If Not m_Recordset Is Nothing Then
112. If m_Recordset.State = adStateOpen Then
113. m_Recordset.Close
114. End If
115. Set m_Recordset = Nothing
116. End If
117.
118. If Not m_DataCombo Is Nothing Then
119. Set m_DataCombo = Nothing
120. End If
121. End Sub