autocompletar en datacombo al escribir
TRANSCRIPT
Autocompletar en DataCombo al escribir
<Volver> - Anterior - Siguiente
Contenido
Descripción
Autocompletar Datacombo usando la propiedad MatchEntry
Autocompletar con el método Find
Relacionados
Descripción
En esta página hay dos ejemplos para poder autocompletar mientras se escribe en un control DataCombo
El primer Código lo hace utilizando la propiedad MatchEntry del DataCombo para poder autocompletar mientras se escribe en el control. El segundo código 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 búsqueda 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 "NombreCompañía" de la tabla proveedores.
En dicho campo, por poner un ejemplo, hay dos nombres de compañias 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 compañia "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 diseño ya que en tiempo de ejecución es de solo lectura.
Controles
Dos controles ADODC
Un control DataGrid
Un Control DataCombo
Un CommandButton
formulario con los controles
Código fuente en el formulario
Texto plano Imprimir
1. Option Explicit 2. 3. 4. ' Botón 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 conexión 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 NombreCompañía,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 = "NombreCompañía" 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 ( Método 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 código fuente utiliza un simple módulo de clase.
Este módulo tiene dos métodos. 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 método, se debe ejecutar en el evento KeyPress, enviándole como parámetro el código Ascii para que la función 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 módulo de clase ( Class1 )
Nota: En este caso se utiliza la base de datos Nwind instalada en el Dir de vb6
Código fuente en el formulario
Texto plano Imprimir
1. Option Explicit 2. 3. ' variable para utilizar el módulo 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 conexión 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 NombreCompañía,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 = "NombreCompañía" 41. End With 42. 43. Adodc1.Recordset.MoveFirst 44. DoEvents 45. End Sub 46. 47. Private Sub DataCombo1_GotFocus()
48. ' Le envía como parámetro 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. ' función que autocompleta ( Le envía le código 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 módulo de clase 63. If Not Obj Is Nothing Then 64. Set Obj = Nothing 65. End If 66. End Sub
Código fuente del módulo de clase ( Class1 )
Texto plano Imprimir
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. ' función 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 función 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 módulo 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