2012-12-26 22 views
6

Ho un modulo di Windows, contenente una casella di testo e un datagridview. Non appena viene modificato il testo della casella di testo, viene aggiornata l'origine dati della vista dati. È fatto gestendo l'evento TextChanged della casella di testo e assegnando all'origine dati una nuova lista, ad esempio. Di solito la nuova origine dati contiene 1000+ righe, una quantità abbastanza grande di dati. Inoltre, interrogare il DB per recuperare questo elenco richiede anche molto tempo.The Magic Of DataGridView

Ciò che mi sorprende è che se digito abbastanza velocemente nella casella di testo, il datagrid sospende il rendering stesso e ancora e restituisce solo il risultato finale. Ignora completamente i risultati medi. Questo ha senso perché il thread dell'interfaccia utente in esecuzione è occupato durante le modifiche di testo consecutive. Ma perché posso ancora scrivere nella casella di testo?

  1. TextChange
  2. Prelevamento dati
  3. Rinfrescante DataGridView (senza rendering/pittura)
  4. TextChange
  5. Prelevamento dati
  6. Rinfrescante DataGridView (senza rendering/pittura)
  7. ... TextChange
  8. Recupero dati
  9. Refreshing DataGridView (rendering/pittura finale)
  10. Fine.

È come se la casella di testo fosse su un altro thread ma non lo è assolutamente. Qualcuno sa perché?

risposta

6

Questo non è specifico di DataGridView, qualsiasi finestra di Windows ha automaticamente questa capacità. Viene fornito dalla coda di messaggi , una struttura dati associata a un thread che visualizza una finestra. Quando il thread è occupato a fare qualcos'altro, Windows aggiunge un messaggio alla coda su un evento di input come un clic del pulsante del mouse o una pressione di un tasto della tastiera.

Una volta che il filo termina quello che sta facendo, essa rientra nel ciclo di messaggi (quella iniziata da Application.Run()), recupera il messaggio dalla coda e lo gestisce. Quale svolta fa scatenare l'evento TextChange. Quindi un buon modo per visualizzare la coda è come un buffer . Può memorizzare fino a 10.000 eventi per impostazione predefinita.

+0

È vero. Ma perché la casella di testo elabora effettivamente il messaggio di input (messaggio key press) ma dgv non esegue il rendering dopo ogni pressione di un tasto? – Alireza

+1

Il messaggio di disegno è un messaggio a bassa priorità, consegnato solo quando la coda è vuota. –

+0

Grazie Hans. Voglio saperne di più sul thread dell'interfaccia utente, sul loop dei messaggi e sulla priorità dei messaggi. Vuoi nominare un buon riferimento? – Alireza

Problemi correlati