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