Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    Grazie Alka! Ho capito benissimo cosa intendi!
    In sostanza l'interrogazione al DB è fatta con il .toList()

    una volta racchiuso il risultato (globale) in un oggetto (listaOspiti) poi filtro quello con LINQ racchiudendo i risultati filtrati in un secondo oggetto (lista).

    Ho provato ma mi da un errore:

    : 'Impossibile eseguire il cast di oggetti di tipo 'WhereSelectListIterator`2[miaAPP.dgv_ospiti,miaAPP.dgv_ospiti]' sul tipo 'System.Collections.Generic.List`1[miaAPP.dgv_ospiti]'.'

    Importante sapere che non ho messo la dichiarazione dell'oggetto con tutti i record nel load ma come variabile del form in questo modo:
    codice:
    Dim listaOsp As List(Of dgv_ospiti) = New efTotDb().dgv_ospiti.ToList()

  2. #12
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    Ok ho risolto l'errore modificando il filtro così:

    codice:
     Private Sub filtraOsp() Handles TextBox1.TextChanged
            Dim lista = listaOsp.Where(Function(o) o.cognome_Osp.StartsWith(TextBox1.Text))
            dgvOsp.Rows.Clear()
            For Each ospite As dgv_ospiti In lista
                Dim imgSex As Bitmap = My.Resources.sex_maschio16
                If ospite.sesso_Osp = True Then
                    imgSex = My.Resources.sex_maschio16
                End If
                dgvOsp.Rows.Add(ospite.id_Osp, ospite.sesso_Osp, imgSex, ospite.cognome_Osp, ospite.nome_Osp, ospite.cf_Osp, ospite.indirizzo_Osp, ospite.com_Res, ospite.prov_Res, ospite.dataNascita_Osp, ospite.com_Nas, ospite.com_Res)
            Next
    
        End Sub
    Purtroppo però quando cancello il testo dalla textbox (quindi ricarica tutto) va sempre lento

    Si parla di 7.700 record per questa tabella...forse son troppi...non so perchè col bindingsource+dataset allora però andasse bene....


    Ho proovato anche impostando l'entity come dataSource del progetto e ci ho agganciato la DGView ma ho scoperto che i bindingsource con entity perdono la funzione "filter" quindi siamo punto a capo...

  3. #13
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Purtroppo però quando cancello il testo dalla textbox (quindi ricarica tutto) va sempre lento
    Si parla di 7.700 record per questa tabella...forse son troppi...non so perchè col bindingsource+dataset allora però andasse bene....
    Secondo me, il problema è che tu ogni volta stai svuotando il DataGridView e inserisci di nuovo tutti i record, ma quell'oggetto è fatto appositamente per fornire una vista filtrata/ordinata dei dati, quindi non dovresti essere tu ad applicare i criteri e caricare i dati nell'ordine corretto.

    Secondo me, data la tua implementazione, sarebbe sufficiente acquisire tutti i dati con Entity Framework e salvarli all'interno del DataGridView, poi sfruttare le funzionalità di questa classe applicando il filtro basato sul testo nella TextBox.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #14
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    Ciao Alka! Si come ho detto mi serviva farlo "a mano" per via delle colonne immagini unbounded!
    Alla fine però ci sono riuscita facendo così:

    • Ho aggiunto l'entità alle origini dati del progetto
    • Ho agganciato un bindingSource all'origine dati sopracitata
    • Ho agganciato la datagridview al bindingSource sopracitato
    • Ho usato il tuo modus (quello di chiamare solo una volta il .toList() al load e filtro in questo modo:

    codice:
    dim lista = from o in listaOspiti
                   where o.cognome_Osp.startsWith(textbox1.text)
                   select o
    
    mioBindingSource.dataSource = lista
    • Infine per le colonne immagine unbounded uso questo:

    codice:
    Private Sub settaImgOsp(sender As Object, e As DataGridViewRowStateChangedEventArgs) Handles dgvOsp.RowStateChanged
            'LA CELLA CON ID 1 è quella che contiene il valore TRUE/FALSE -> true=Femmina e false=Maschio
            'LA CELLA CON ID 2 è quella che conterrà l'immangine del sesso dell'ospite
            If e.Row.Cells(1).Value = True Then
                e.Row.Cells(2).Value = My.Resources.sex_femmina16
            Else
                e.Row.Cells(2).Value = My.Resources.sex_maschio16
            End If
    
        End Sub
    e finalmente funziona tutto!

    Se (visto che sei più esperto) reputi che debba agganciare un evento diverso da rowStateChange (in termini di performance e stabilità) sono tutta orecchi!

    Nel frattempo è insorto un altro problema ma lo tratterò in un nuovo topic!

    Grazie ancora!!

    ps: un'ultima domanda:

    a me farebbe comodo avere "la banca dati" disponibile sempre in tutto il progetto senza dover richiamare ogni volta quindi pensavo di creare un modulo in cui stoccare tutti gli oggetti list(of ) che avrei popolato al load dell'applicazione con EF e .toList() e di lasciarli a disposizione Public per usarli in tutto il resto del progetto.
    Secondo te è una mossa azzardata per il consumo di memoria? Tra Tabelle e Views sono 27 oggetti.

    Grazie ancora!
    Ultima modifica di Veronica80; 11-10-2018 a 11:45

  5. #15
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    ps: un'ultima domanda:

    a me farebbe comodo avere "la banca dati" disponibile sempre in tutto il progetto senza dover richiamare ogni volta quindi pensavo di creare un modulo in cui stoccare tutti gli oggetti list(of ) che avrei popolato al load dell'applicazione con EF e .toList() e di lasciarli a disposizione Public per usarli in tutto il resto del progetto.
    Secondo te è una mossa azzardata per il consumo di memoria? Tra Tabelle e Views sono 27 oggetti.
    Il numero di oggetti non è significativo: ho programmi dove mi capita di averne di più o di meno a seconda dei casi.
    Quello che conta è la quantità effettiva di dati che intendi caricare, cioè la combinazione tra numero di record e colonne stimata in megabyte.

    Se sono dati che puoi permettere di caricare in memoria senza saturarla e li usi spesso, la tua scelta può avere senso, sempre se ciò non aggrava di troppo l'avvio del programma; in alternativa, potresti adottare un approccio "pigro", cioè caricare on demand e tenere i dati salvati una volta richiesti, così ottimizzi il caricamento facendolo solo quando serve e sfruttando la memoria in seguito.

    Se i dati devono essere però sempre aggiornati, ad esempio in caso di multi utenza, devi necessariamente eseguire sempre le query per avere anche la certezza di lavorare con i dati più recenti.

    Difficile comunque dare risposte efficaci e definitive senza conoscere la natura dei dati, il tipo di utilizzo e gli alti requisiti dell'applicazione. Sperimenta e verifica direttamente sul campo qual è il bilanciamento ottimale.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.