Questo è veramente semplice.. Net TableLayoutPanel - I controlli di schiarimento sono molto lenti
Ho un TableLayoutPanel che è popolato con controlli (solo etichette, pulsanti e alcuni pannelli con pulsanti) basato su una query di database. Quando i dati devono essere aggiornati, utilizzo TableLayoutPanel.Controls.Clear(). Sfortunatamente, questa è un'operazione molto lenta. Mi aspetterei che fosse più veloce del codice che popola la tabella, ma è almeno 3 o 4 volte più lento.
Ho definitivamente dimostrato che la lentezza si ha quando si esegue Controls.Clear() eseguendo questa operazione come singola cosa eseguita su TableLayoutPanel dopo che viene visualizzata una finestra di messaggio (quindi la procedura restituisce). I controlli spariscono visibilmente dal basso verso l'alto. Quando si utilizza il recordset per ripopolare TableLayoutPanel, la velocità dei controlli visualizzati dall'alto verso il basso è quasi più veloce di quanto possa vedere.
Sto già facendo TableLayoutPanel.SuspendLayout() e ResumeLayout().
L'utilizzo di this.DoubleBuffered = true
nel modulo non sembra fare nulla.
Potrei semplicemente eliminare l'intero controllo e ricrearlo attraverso il codice, ma questo è un grosso problema e rende inutile avere una bella GUI di progettazione dei form. Dovrei scavare in tutte le proprietà che ho impostato sul controllo e creare una linea di codice per questo (anche se penso che potrei ottenere questo dal codice del designer stesso, sembra ancora sbagliato).
Qualche idea su come svolgere il lavoro più velocemente? Sono persino aperto all'utilizzo di altri metodi oltre a un TableLayoutPanel ... Ho solo la libertà di inserire più pulsanti per cella o di escludere tale da poter estendere le colonne nell'intestazione della tabella.
Can C# può almeno congelare l'intero modulo mentre si ridisegna e quindi dipingere tutto in una volta?
Si parla di TableLayoutPanel e FlowLayoutPanel. –
Hai eseguito un profiler su di esso per dimostrare esattamente quella riga di codice? È possibile che si verifichino effetti collaterali con questa riga di codice? Gli eventi vengono chiamati per rendere i controlli invisibili o simili? – WillfulWizard
@Willfulwizard ho aggiornato il mio post con il motivo per cui credo che sia il Controls.Clear() che sta prendendo molto tempo. – ErikE