+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Ricerca in FlexGrid con TextBox

  1. #1
    pierovb non è in linea Scolaretto
    Ciao a tutti,
    riesumando un vecchio programma, usavo ancora i famigerati controlli Data, per effettuare una ricerca all'nterno di una
    dbgrid usavo il seguente codice
        rapo = txtRicerca.Text
        Cogno = Chr$(34) & rapo + "*" & Chr$(34)
        sSQL = "SELECT * FROM Archivio WHERE Cognome Like " & dblApos(Cogno) & " Order By Id DESC"
        Data1.RecordSource = sSQL
        Data1.Refresh
    
    che mi "scremava" i cognomi mano a mano che inserivo le lettere che li componevano.

    Ho provato ad adattarlo in una FlexGrid, ma con 0 risultati.

    Ho trovato il seguente codice nel forum

    Dim N
    With RUBRICA.FLEX
    .Visible = False
    For N = 1 To .Rows - 1
    If Left$(.TextMatrix(X, 2), Len(TrovaContatto.Text)) = TrovaContatto.Text Then
    .Row = N
    .Col = 0
    .Col = 2
    RUBRICA.FLEX.Row = N
    RUBRICA.FLEX.Col = 0
    RUBRICA.FLEX.ColSel = RUBRICA.FLEX.Cols - 1
    TrovaContatto.SetFocus
    Exit For
    End If
    Next
    .Visible = True
    End With
    
    L'ho inserito nell'evento Change/KeyPress della textbox TrovaContatto, ma purtroppo evidenzia inesorabilmente sempre e solo la 1° row !!
    Qualche aiutino ?!?
    Grazie

  2. #2
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Tu vuoi applicare un filtro, mentre quella routine si posiziona solo sulla prima occorrenza, e per inciso è pure sbagliata (il contatore di riga è N ma viene usato X ed è per quello che non funziona ed è case sensitive).

    Oltretutto non ha alcun senso nascondere la griglia con .Visible = False (bruttissimo), caso mai si dovrebbe usare .Redraw = False.

    Ad ogni modo la struttura della routine che ti serve non è difficile, dovrebbe essere più o meno così:

    Dim i as long 
    Dim sString As String
    sString = UCase$(Trim$(TrovaContatto.Text))
    With .FLEX
        .Redraw = False
        For i = 1 to .Rows -1
            If Left$(UCase$(.TextMatrix(i, 2)), Len(sString) = sString Then
                .RowIsVisible(i) = True
            Else
                .RowIsVisible(i) = False
            End If
        Next i
        .Redraw = True
    End With
    
    Considera comunque il fatto che l'utente deve per forza ricordarsi i primi caratteri della stringa da cercare, e non sempre è così.
    La ricerca è senz'altro più utile se l'utente deve digitare 'alcuni caratteri' ovvero eseguire una ricerca sul 'contenuto' della stringa anziché sull'inizio.
    Per ipotesi, se hai Cognome + Nome nel campo e l'utente non ricorda il Cognome ma solo il Nome allora la ricerca sul contenuto è più semplice. In tal caso, invece di usare:

            If Left$(UCase$(.TextMatrix(i, 2)), Len(sString) = sString Then
    
    dovrai usare:

            If InStr(UCase$(.TextMatrix(i, 2)), sString) > 0 Then
    
    Ovviamente: SE&O.

    ℹ️ Leggi di più su gibra ...

  3. #3
    pierovb non è in linea Scolaretto
    Grazie.
    Mi ero accorto di quella X al posto della N, ma anche sostituendola non cambiava nulla.

    Il codice da te proposto inserito nell'evento Change/KeyPress della text TrovaContatto
    solleva l'errore :
    Errore di compilazione :
    Assegnazione alla costante non ammessa

    .RowIsVisible(i) = True
    perché ?

  4. #4
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Siccome ho scritto il codice al volo (non testato) ho controllato la proprietà RowIsVisible sulla guida, che riporta erroneamente che è a lettura/scrittura mentre RowIsVisible è in realtà a sola lettura

    Allora bisogna nascondere le righe impostandone l'altezza a 0:

    Imposta una variabile a livello di modulo:
    Dim m_lRowHeight As Long
    
    che serve per conoscere l'altezza della riga.


    Nell'evento Form_Load() la valorizzi:
    m_lRowHeight = FLEX.RowHeight(1)
    
    Importante:
    1) va fatto prima di impostare qualsiasi altra cosa che personalizza la griglia
    2) la proprietà RowHeightMin della griglia deve essere lasciata a 0 (lo è per default)



    Poi nel ciclo la usi così:

    RowHeight(i) = m_lRowHeight         ' sostituisce al RowIsVisible(i) = True
    
    RowHeight(i) = 0         ' sostituisce al RowIsVisible(i) = False
    
    ℹ️ Leggi di più su gibra ...

  5. #5
    pierovb non è in linea Scolaretto
    Funziona perfettamente.
    Sei, semplicemente, ECCEZIONALE !!!!!!!!!
    Grazie.
    Piero

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [VB6]: Ricerca all'interno di una FlexGrid con textbox...
    Da maninblack nel forum Visual Basic 6
    Risposte: 9
    Ultimo Post: 04-11-2012, 18:14
  2. FlexGrid.CellBackColor (Colorare cella di una FlexGrid)
    Da StegcO nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 23-10-2009, 11:40
  3. Ricerca da TextBox in DataGrid
    Da dade_n nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 21-02-2009, 17:53
  4. Risposte: 3
    Ultimo Post: 21-09-2008, 14:33
  5. Risultato ricerca in una FlexGrid
    Da queen_live78 nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 01-03-2005, 23:38