Autore Topic: gb.searchbox  (Letto 7496 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #45 il: 10 Novembre 2010, 16:13:21 »
Si, esatto.

Solo che quando la ripetevo per le searchbox mi andava in blocco l'install. Forse sbagliavo qualcosa, perché ora me l'ha installato...  ???

Ho un problema... quando lancio il runtime mi va in errore sulla SearchBox, "Cannot load class 'SearchBox': Multiple Inheritance".

PS: Dai sorgenti ho cancellato sia la classe "SearchBox" che la form "Flist"...

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #46 il: 10 Novembre 2010, 16:16:34 »
Una volta cancellate le classi prova a fare Progetto --> Ridisegna Progetto

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #47 il: 10 Novembre 2010, 16:22:27 »
Con "Ridisegna" andava ugualmente in errore... poi ho provato con "aggiorna tutte le form" ed ho risolto!  :ok:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #48 il: 10 Novembre 2010, 16:24:58 »
ecco, appunto era la prossreima prova da fa :)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #49 il: 10 Novembre 2010, 16:28:46 »
Ritornando sull'argomento delle gerarchie dei controllli, ho visto che ogni controllo ha due proprietà che in teoria ti danno l'ordine del focus:
.Next e .Previous

Sono proprietà Read Write ma se setto una di queste proprietà con un controllo a mia scelta, sembra che continui a mantenere l'ordine originale...
 :-\


Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #50 il: 10 Novembre 2010, 16:37:27 »
Avevo provato anch'io qualcosa del genere con .next e con .previous perché ho dei controlli su container differenti. Ma alla fine ho optato per gestire il focus da codice, con .setFocus all'evento KeyPress --> Key.Tab...
Almeno inserendo le search da ide non devo gestire anche quelle, perché come dicevi prima, ora seguono l'andamento della "gerarchia".

Invece quest'altra cosa è magnifica... La searchbox si comporta esattamente come una textbox.
Nel mio codice mi sono creato (seguendo sempre i tuoi insegnamenti :) ) questa Sub per pulire tutti i campi di testo presenti nel form... e pulisce anche quelli dei SearchBoxs.  ;)

Codice: vb.net [Seleziona]
Public Sub pulizia(Optional salta As String)
Dim txt As Control
  For Each txt In Me.Controls
    If (Object.Class(txt).Name) = "TextBox" Or (Object.Class(txt).Name) = "TextArea" Then
      If txt.name <> salta Then Object.SetProperty(txt, "Text", Null)
    Endif
  Next
End


Nel loop il nome del campo Text della SearchBox viene rilevato come "Txt".

PS: ho fatto anche un'altra Sub simile per colorare e per settare il font di tutte le label...  ;D
« Ultima modifica: 10 Novembre 2010, 16:42:05 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #51 il: 11 Novembre 2010, 16:25:18 »
Milio,

un chiarimento importante

Ho guardato il codice di come viene popolata la lista della searchbox, che è una collection...
In questa collection c'è un Value ed un Key...

Ipotizza che nella mia ricerca, per il campo specificato ci sono più risultati uguali (nel pratico cerco i comuni d'italia, e ce ne sono ad esempio 2 che si chiamano "BRIONE"). Quando seleziono uno dei due nella txt della searchbox mi viene visualizzato il nome "BRIONE" (però come faccio a distinguerli)...
La mia domanda è... posso contemporaneamente inserire anche il CodiceIstat in un'altra casella?

Una soluzione potrebbe essere quella di impostare il VALUE come una stringa che mi restituisca nella txt della searchbox il NomeComune & " " & CodiceIstatComune... Però io volevo sapere se la searchbox permette la restituzione di array, e se sì come richiamarlo per popolare contemporaneamente più textbox...

Nel mio programma scelgo il nome di un Comune d'Italia (con una searchbox).
Poi, con il nome del comune scelto, faccio fare delle Query che mi restituiscono i valori degli altri campi, che inserisco nelle apposite textbox. Da qui l'errore quando c'è omonimia di nomi di comuni (tipo "BRIONE"). In pratica è come se perdessi il filo logico, ed usassi un campo "non-univoco" (tipo il nome del cognome) per recuperarlo...
I campi secondari tipo: CodiceIstat, Provincia, Regione, ecc. si trovano nella stessa tabella del Comune --> quindi mi chiedevo se con un'operazione (scelta del nome) potevo ottenere direttamente tutti i campi.

La mia idea è... nella lista dovrebbe comparire: NomeComune & ", " & ProvinciaComune (---> Milano, MI)
mentre nel risultato avrei un array con Milano, MI, Lombardia, [n° codistat], ecc...
In questo modo potrei popolare tutte le altre textbox (all'evento _Focus della searchbox).


[Edit]
Ho provvisoriamente risolto... restituendo come risultato una stringa con (Comune - Provincia - CodiceIstat)
Nell'evento _Focus poi gli faccio dividere la stringa con split e prendo le porzioni trimmate (ossia senza spazi a inizio e fine).
La stringa[0] riscrive la txt della searchbox, mentre la stringa[2] riscrive la textCodiceIstat.text...
Non mi piace molto, ma almeno è funzionale... Però se c'è di meglio, tipo soluzioni con restituzione di array, sono pronto a modificare immediatamente il mio arzigogolato codice!  :)
« Ultima modifica: 11 Novembre 2010, 17:10:20 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #52 il: 11 Novembre 2010, 17:20:29 »
Quando ho fatto la SearchBox l'ho ragionata in questo modo:

Key = codice univoco del record
Value = descrizione per la ricerca

Sta a te decidere quale sia il campo Key per poter riconoscere il risultato cercato...

Nel tuo caso, dato che lavori con un file tipo csv, dovresti crearti una spece di record con un array di tipo String[][] e potresti mettere come key l'Index dell'array che hai creato per importarti il file.
Nel Value, come tu giustamente hai detto, NomeComune, Provincia (Es: "Montjovet, AO")

quando la SearchBox, nell'evento Found (e non LostFocus) ti restituisce il Key basta che popoli le varie TextBox in questo modo: Me.TextBox1.Text = MioArray[Me.SearchBox.Key][<Numero del Campo>]

Tutto ok? ;)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #53 il: 11 Novembre 2010, 18:27:35 »
Se ho capito bene l'Array che mi devo creare è una variabile Public indipendente dalla searchbox.

Per popolarla, quando eseguo la Query (ho importato il file csv dei comuni in una Tabella dentro il database...) e costruisco il risultato (ossia la collection della lista della searchbox), aggiungo all'array tanti campi quanti sono quelli che m'interessano.

Per ogni record aggiunto alla collection... devo aggiungerne uno all'array rispettando lo stesso indice.
Poi mi richiamo l'indice di questo array attraverso il searchbox.Key... e di questo sub-array mi cerco la stringa che interessa a me.

Giusto?
Intanto ci provo...  :)

PS: l'evento che uso è proprio Found... ma non so perché continuo a scrivere Focus...  :rolleyes:
« Ultima modifica: 11 Novembre 2010, 18:36:03 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #54 il: 11 Novembre 2010, 20:32:32 »
Ho provato, ma con scarsi risultati...  :-[

Mi rendo conto che le mie carenze nascono dalla non-conoscenza degli Array, bidimensionali.

Nella Sub della query per popolare la lista della searchbox ho dichiarato questo:

Codice: vb.net [Seleziona]
Public mioArray As New String[][]

Public Sub ricercami(campo As String, dato As String) As Collection
    Dim sName As String
    Dim sPercorso As String
    Dim $hRicerca As New Connection
    Dim sql As String
    Dim ris As String
    Dim i As Integer
    Dim hres As Result
    Dim risultato As New Collection
    Dim primo As New String[]
    
    With $hRicerca
      .Type = avvio.sDbType
      .Host = avvio.sDbPath
      .Login = avvio.sDbLogin  
      .Password = avvio.sDbPass
      .Name = avvio.sDbName
    End With
  
    $hRicerca.Open
      $hRicerca.Begin
      
            sql = "SELECT * FROM comuni WHERE " & campo & " LIKE '%" & my(dato) & "%';"
  
            hres = $hRicerca.Exec(sql)
            
            If hres.Available Then
              mioArray.Clear
              i = 0
              For Each hres
                primo.Clear
                primo.Add(hres!comune, 0)
                primo.Add(hres!prov, 1)
                primo.Add(hres!codistat, 2)
                mioArray.Add(primo, i) ' --> questo dovrebbe popolare il mioArray bidimensionale
                ris = hres[campo] & " - " & hres!prov
                risultato.Add(ris, i) ' --> questo va a popolare la lista della searchbox
                Inc i
              Next
            Endif
      $hRicerca.Close
  
  Return risultato
End



Quando però chiamo l'evento _Found...
Codice: vb.net [Seleziona]
Public Sub sbxLuogoNasc_Found()
  Message(mioArray[Me.sbxLuogoNasc.key][2])
End


...mi restutisce sempre l'ultimo record dell'Array, ossia l'ultimo CodiceIstat della lista della searchbox sbxLuogoNasc.  :rolleyes:
« Ultima modifica: 11 Novembre 2010, 21:13:14 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #55 il: 11 Novembre 2010, 21:17:15 »
Allora... premesso che ho detto un sacco di str.....e, forse perche' stavo per uscire dall'ufficio e ho letto velocemente il tuo post, ma anche tu! come fai ha prendermi sempre in parola   :mad:   ;D ;D ;D ;D

Stendiamo un velo pietoso su quello che ho scritto prima... io ero rimasto che tu avevi un file csv da caricare in un array... non avevo letto che l'hai caricato in un database...

Basta allora che fai in questo modo:

Codice: vb.net [Seleziona]
Private RecComuni as Result

Public Sub CaricoLista()
Dim Rec As Result
Dim Nx As Integer

  RecComuni = MiaConn.Exec("Select * From Comuni;")
  For Nx = 0 To RecComuni.Max
    RecComuni.MoveTo(Nx)
    Me.SearchBox1[Nx] = Rec["Comune"] & ", " & Rec["Provincia"]
  Next

End

Public Sub SearchBox1_Found()

  RecComuni.MoveTo(CInteger(Val(Me.SearchBox1.Key)))
  Me.TextBox1.Text = Rec[quellochevuoi]
  'ecc ecc ecc

End

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #56 il: 11 Novembre 2010, 21:52:16 »
Non ci riesco proprio... :rolleyes:

Nel codice che mi hai indicato ci sono due variabili result: Rec e RecComuni

Ma Rec, come viene generato?
E poi se Rec è una Dim, come faccio a richiamarla nella Sub _Found?

Questa riga mi va in errore: Not An Array... --> Me.SearchBox1[Nx] = Rec["Comune"] & ", " & Rec["Provincia"]
« Ultima modifica: 11 Novembre 2010, 21:56:16 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #57 il: 11 Novembre 2010, 21:53:29 »
Scusa...  :-[

Dim Rec va cancellato

e Rec[quellochevuoi] e' RecComuni[quellochevuoi]

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: gb.searchbox
« Risposta #58 il: 11 Novembre 2010, 21:55:01 »
Meglio che ti riscrivo tutto

Codice: vb.net [Seleziona]
Private RecComuni as Result  
  
Public Sub CaricoLista()    
Dim Nx As Integer  
  
 RecComuni = MiaConn.Exec("Select * From Comuni;")  
 For Nx = 0 To RecComuni.Max  
   RecComuni.MoveTo(Nx)  
   Me.SearchBox1[Nx] = RecComuni["Comune"] & ", " & RecComuni["Provincia"]  
 Next  
  
End  
  
Public Sub SearchBox1_Found()  
  
 RecComuni.MoveTo(CInteger(Val(Me.SearchBox1.Key)))  
 Me.TextBox1.Text = RecComuni[quellochevuoi]  
 'ecc ecc ecc  
  
End  

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: gb.searchbox
« Risposta #59 il: 11 Novembre 2010, 21:57:20 »
Mi da errore su questa riga: Not An Array... --> Me.SearchBox1[Nx] = RecComuni["Comune"] & ", " & RecComuni["Provincia"]

PS: un'altra cosa... per abitudine apro e chiudo le connessioni appena eseguite le operazioni di ricerca, ed il risultato mi viene restituito con return. Se chiudo la connessione dovrebbe chiudersi anche RecComuni, che è un suo risultato, o no? Potrei restituire risultato direttamente il result?
« Ultima modifica: 11 Novembre 2010, 22:06:31 da perseo »