Seleccionar fila

Quiero seleccionar la fila del campo encontrado, usando un data bound grid(dbgird32.ocx)
En el evento chage puse este código, pero me selecciona la primera fila del grid no la que tenga la palabra que más se parezca.
Private Sub txtfindw_Change()
Dim palabra As String
palabra = txtfindw.text' caja de texto donde voy ingresando la palabra a buscar
With dtwords.Recordset
'word es el campo donde busco la palabra
.FindFirst "word = ' " & palabra & " ' "
End With
With DBGrid1
.SelBookmarks.Add .Bookmark
End With
End Sub
1

1 respuesta

1
Respuesta de
Me parece un poco fuerte que pongas la búsqueda en el Change del TextBox ya que esto lanzará la búsqueda por cada cambio del texto, esto es cada vez que teclees una letra de ese textbox. Como la búsqueda es un proceso relativamente lento esto se tiene que notar al teclear como una lentitud en la respuesta del TextBox. Parece más apropiado tenerlo en el evento LostFocus, para que la búsqueda se inicie una sola vez cuando el usuario ha terminado de teclear y pasa al dato siguiente.
Sin embargo ese no es el problema, puesto que tal como lo tienes la búsqueda se realizaría con cada letra, tratando de buscar una palabra incompleta, que lógicamente no se encontrará, pero la última búsqueda si que tendrá la palabra completa, y debería encontrarla.
Yo lo que suelo hacer, y te recomiendo siempre, es que en vez de hacer:
.FindFirst "word = ' " & palabra & " ' "
Hagas esto
Dim Busca as string
Busca="word = ' " & palabra & " ' "
Debug.print Busca
.FindFirst Busca
Esto te da la oportunidad de ver que es lo que se está buscando exactamente. Muchas veces te das la sorpresa.
Fíjate bien en que si el dato es numérico debe buscarse una variablle numérica, si comillas, si es una variable de texto debe ir entre comillas simples, y si es una fecha... bueno si es una fecha tienes un bonito problema (mirate la ayuda del método FindFirst para las fechas)
Para hacer las cosas bien deberías comprobar si la búsqueda ha tenido éxito. Esto se hace con la propiedad NoMacht
Es decir algo así como:
if dtwords.Recordset.nomatch then
Msgbox "No se ha encontrado:" & palabra
else
With DBGrid1
.SelBookmarks.Add .Bookmark
End With
end if
Y otra cosa: La instrucción:
.SelBookmarks.Add .Bookmark
Es un metodo ADD sobre la colección SelBookmarks que representa el conjunto de lineas seleccionadas del Grid. Por lo tanto, si la primera línea del grid estaba seleccionada inicialmente, seguirá estando seleccionada, y además lo estará también la correspondiente al registro actual.
Si quieres que la única linea seleccionada en el Grid sea la localizada en la búsqueda, deberás previamente "desseleccionar todas las lineas seleccionadas" esto es borrar toda la colección SelBookmarks. Por ejemplo:
With TDBGrid1.SelBookmarks
While .Count > 0
.Remove 0
Wend
End With
On Error Resume Next
TDBGrid1.SelBookmarks.Add TDBGrid1.Bookmark
El On Error... está para que si no hay ningún registro activo, cosa que ocurrirá si la búsqueda ha fallado o si el recordset está vacío, no salte el error en el ADD
Espero haberte ayudado :-)
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje

Más respuestas relacionadas

¿No es la pregunta que estabas buscando?
Puedes explorar otras preguntas del tema Visual Basic o hacer tu propia pregunta: