autocompletar en datacombo al escribir

14
Autocompletar en DataCombo al escribir <Volver> - Anterior - Siguiente Contenido Descripción Autocompletar Datacombo usando la propiedad MatchEntry Autocompletar con el método Find Relacionados

Upload: ciber-skynet

Post on 27-Dec-2015

30 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Autocompletar en DataCombo Al Escribir

Autocompletar en DataCombo al escribir

<Volver>   - Anterior -   Siguiente

 

 

Contenido

Descripción

Autocompletar Datacombo usando la propiedad MatchEntry

Autocompletar con el método Find

Relacionados

 

 

 

 

 

Page 2: Autocompletar en DataCombo Al Escribir

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.

Page 3: Autocompletar en DataCombo Al Escribir

 

Controles

Dos controles ADODC

Un control DataGrid

Un Control DataCombo

Un CommandButton

 

formulario con los controles

Page 4: Autocompletar en DataCombo Al Escribir

 

 

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  

Page 5: Autocompletar en DataCombo Al Escribir

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

Page 6: Autocompletar en DataCombo Al Escribir

 

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

Page 7: Autocompletar en DataCombo Al Escribir

 

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.    

Page 8: Autocompletar en DataCombo Al Escribir

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()  

Page 9: Autocompletar en DataCombo Al Escribir

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.        

Page 10: Autocompletar en DataCombo Al Escribir

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.                

Page 11: Autocompletar en DataCombo Al Escribir

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  

Page 12: Autocompletar en DataCombo Al Escribir

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