none
[c# - entity framework]combobox, caricare molti records RRS feed

  • Domanda

  • Ciao a tutti.

    Ho il classico problema della lista dei comuni d'italia (8092 records)

    il mio tipo di approccio iniziale per popolare la combobox è il classico:

    mycombo.DataSource = comuniController.GetAll();

    mycombo.DisplayMember = "comune";

    mycombo.ValueMember = "id";

    il metodo GetAll() del controller altro non fa che:

    return myContext.Comuni.ToList();

    Come ben avrete già intuito è di una lentezza mostruosa, anche per via del fatto che

    su uno stesso form ci sono diversi combo che riguardano i comuni (comune nascita, residenza, domicilio fiscale, etc...)

    Sicuramente ci sono metodi più efficienti..... me ne indichereste qualcuno ?

    Grazie in anticipo a tutti.

    RaouL.

    • Spostato Irina Turcu martedì 15 gennaio 2013 14:13 Argomento specifico all'Entity Framework.
    lunedì 14 gennaio 2013 21:33

Tutte le risposte

  • Salve,

    tutti questi record dei comuni d'Italia dove sono memorizzati? In sql server 2008? 

    Il più semplice modo di caricare è fare una select dal db del tipo

    var listaComuni = from tabella in contestoDataBase

    select tabella;

    e poi fai mycombo.DataSource = listaComuni;

    Così dovresti caricare senza fatica la lista dei comuni all'interno della combobox.

    Ti conviene a utilizzare una progessbar per far vedere che sta caricando. E' un classico quando si ha una marea di dati.

    Un saluto

    Fammi sapere

    Cristian


    martedì 15 gennaio 2013 10:06
  • Ciao,

    Un paio di considerazioni:

    1) sicuramente puoi fare una "cache" dei comuni visto che non sono soggetti a cambiamenti, in questo modo tutte le successive query saranno fatto in memoria.

    2) per quanto riguarda la visualizzazione puoi pensare ad un "autocomplete" così da caricare solo un set di comuni in funzione dell' input dell'utente.

    Maurizio


    Maurizio Cinti: [MCT, MCPD]
    Blog: http://mauriziocinti.com
    Twitter: @mcinti78
    LinkedIn: it.linkedin.com/in/mauriziocinti

    martedì 15 gennaio 2013 14:37
  • Ciao e grazie ad entrambi per le risposte.

    Per "cache" cosa devo intendere, di caricarmi la lista ad esempio all'avvio del programma una volta sola ?

    Grazie :)

    mercoledì 16 gennaio 2013 16:17
  • Ciao e grazie ad entrambi per le risposte.

    Per "cache" cosa devo intendere, di caricarmi la lista ad esempio all'avvio del programma una volta sola ?

    Grazie :)

    Ciao,

    si direi che puoi fare in questo modo, i dati diciamo "statici", cioè che non sono soggetti a cambiamenti nel ciclo vita dell'App li puoi tranquillamente mettere in una cache locale.

    A te decidere (in base all'App) se è meglio scaricare la lista durante l'avvio dell'App o se al momento della prima richiesta effettuare la "get" dei dati dal DB e quindi mettere in cache il risultato.

    Maurizio


    Maurizio Cinti: [MCT, MCPD]
    Blog: http://mauriziocinti.com
    Twitter: @mcinti78
    LinkedIn: it.linkedin.com/in/mauriziocinti

    mercoledì 16 gennaio 2013 16:24
  • Ok, è ancora un pò lento, soprattutto al primo avvio ma direi che può andar bene così come suggerito.

    Carico la lista all'avvio dell'applicazione e stop.

    Mi è però nato un fastidioso problema:

    Le proprietà della combo sono settate su:

    AutoCompleteMode: SuggestAppend

    AutoCompleteSource: ListItems

    DropDownStyle: DropDown

    I dati li popolo così:

    DataContext context = new DataContext();

    comboComuni.DataSource = context.GetAll();

    comboComuni.DisplayMember = "comune";

    comboComuni.ValueMember = "id_comune";

    Ora, quando sono sulla combo e inizio a digitare, mi compone e suggerisce correttamente

    ciò che è presente nella lista, ad esempio digito: ro -> mi suggerisce: Roma, Rovigo, etc...

    Ciò che mi crea problemi è quando lascio la combo.. mi spiego meglio:

    ho necessità di ricavare l'id del comune, che sarebbe il ValueMember e quindi:

    int comuneID = int.Parse(comboComuni.SelectedValue.ToString());

    però, quando mi sposto dal combo, ad esempio con il tasto tab, è come se quello che vedo non sia "letto", cioè, se ho scelto "Roma" e provo anche solo a farmi restituire "Roma" a video, non ottengo nulla.

    Sono costretto comunque ad aprire la combo mediante il dropdown e scegliere l'item per avere un valore.

    Come posso risolvere ?

    Grazie !

    domenica 20 gennaio 2013 17:45