2011-01-12 11 views
12

Ho un modulo a più riquadri, nel riquadro di sinistra è un albero e nel pannello di destra è un pannello. Le selezioni di alberi danno luogo a specifici UserControls caricati sul Pannello. In questo caso, poiché il modulo padre è sempre caricato, non posso collegarmi all'evento Mostrato del modulo genitore.Come chiamare un metodo in un UserControl dopo che è stato mostrato?

La maggior parte dei miei UC ha un DataGridView non associato su di essi che deve essere compilato quando viene creato l'UC. Ci possono essere 50.000 righe aggiunte in anticipo, da un database di SQL Server.

Fino ad ora ho popolato le griglie durante il costruttore UC, ma da quando abbiamo iniziato a lavorare con 50.000 righe le cose sono cambiate. Ho scoperto che il popolamento della griglia con 50.000 righe dal costruttore richiede almeno 15 minuti per una ragione pazzesca. Tuttavia, se aspetto di popolare la griglia finché non faccio clic su un pulsante o dall'evento Load, sono necessari 15 secondi. Questo è un mistero. Quindi sto cercando di spostare il caricamento della griglia altrove.

Quando provo a compilare la griglia dall'evento Load, tuttavia, ci sono incoerenze visive. Cosa succede, vedi una piccola versione del mio UC apparire, ci vogliono 15 secondi per caricare le file DGV, e POI l'UC si espande per riempire il Pannello (la proprietà UC Dock è impostata su Fill). Quindi non mi piace neanche questa opzione.

L'evento mostrato sarebbe un luogo perfetto per caricare la mia griglia, se esistesse per le UC. Qualcuno sa di un altro modo per farlo?

+1

Una domanda migliore è il motivo per cui ci vogliono 15 minuti per caricare nel costruttore, ma 15 secondi altrove. – Justin

+1

Probabilmente perché la sua logica di popolazione è in esecuzione in base a qualcosa che cambia molte volte durante la costruzione di un modulo, o ha il sovraccarico della cache caricando diversi DGV sul caricamento del modulo. – KeithS

+0

Le idee sono benvenute sul perché questo sta accadendo. Preferirei rimanere con il mio precedente approccio. Il codice consiste in una chiamata al database (i dati non cambiano) e riempie un singolo DGV. C'è una differenza tra la chiamata dal costruttore e la chiamata dal pulsante: il costruttore viene chiamato da un thread di BackgroundWorker. Potrebbe essere la causa di ciò? –

risposta

16

La mia risposta a un problema simile era di popolare il DGV quando la griglia era diventata visibile. Questa è l'essenza del lazy-loading; ottenere le informazioni all'ultimo secondo possibile.

Hook in VisibleChanged, che si attiva quando il controllo ha Show() o Hide() chiamato o la proprietà Visible impostata manualmente. Se il campo è attualmente visibile, E il controllo non è in fase di chiusura o di eliminazione (poiché in alcuni casi è possibile che in questo caso i controlli diventino visibili), eseguire la popolazione della griglia.

Ecco il gestore necessaria, molto semplice:

protected override void OnVisibleChanged(EventArgs e) 
{ 
    base.OnVisibleChanged(e); 

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic 
} 
+0

Grazie, sono sicuro che funzionerebbe per un UC di dimensioni statiche, tuttavia quando provo con il mio UC che Docks "Full" nel suo contenitore, la griglia si popola prima che l'UC venga ridimensionato per adattarsi al contenitore, risultando in qualche modo fluttuante -in-mid-air scrollbars per i 15 secondi necessari per caricare la griglia. Ho trovato un modo per caricare la griglia, chiamando un metodo dopo aver caricato l'UC (necessario per usare ugh DoEvents per farlo disegnare per primo!). –

+0

È vicino a quello che voglio, ma ora questo tempo di caricamento si svolge all'esterno di BackgroundWorker e la GUI diventa meno reattiva (potenziale (Non risponde) che odio). Questa potrebbe essere la mia soluzione migliore però. –

+0

Huh. Anche i miei UC con la griglia sono riempiti. Prova a utilizzare SuspendLayout e ResumeLayout per mettere in pausa il posizionamento degli elementi della finestra finché la popolazione non è completa.Per risolvere il problema di mancata risposta, è possibile impostare il controllo utente con un delegato e un gestore eventi che si interfaccia con una routine di pop-up asincrona. Chiedi all'UC di avviare un metodo BeginPopulate, iscriversi a un evento PopulateComplete e svolgere il lavoro di riempimento della griglia da quel gestore. – KeithS

Problemi correlati