2015-08-04 17 views
5

Ho bisogno di avere una finestra di dialogo di file aperti per 1000 tipi di file (* .000 - * .999). Ma aggiungendolo al filtro, la finestra di dialogo diventa molto lenta nella scelta dei tipi di file. C'è qualcosa che posso fare per accelerare questo?OpenFileDialog con molte estensioni

string text; 
for (int i = 0; i <= 999; i++) 
{ 
    text.Append("*." + i.ToString("000") + "; "); 
} 

string textWithoutLastSemicolumn = text.ToString().Substring(0, text.ToString().Length - 2); 
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn; 
+0

hai qualche collegamento alla rete? – Abhishek

+1

Posso chiederti perché vorresti farlo prima? o_O – derape

+1

Mi unirò al commento di @derape, qual è lo scopo di aggiungere tante estensioni per aprire la finestra di dialogo dei file? '*. *' è abbastanza. Se stai creando quei file, non dovresti usare le estensioni * diverse * al primo posto (puoi invece modificare il nome del file). Va bene aggiungere alcune estensioni, ma non 1000. – Sinatr

risposta

5

Se sei bloccato con quelle estensioni, posso vedere 2 possibili soluzioni. O accettare questa soluzione piuttosto veloce, ma non al 100% corretto:

ofd.Filter = "Supported extensions | *.0??;*.1??;*.2??;*.3??;*.4??;*.5??;*.6??;*.7??;*.8??;*.9??"; 

Questo accetterà tutte le estensioni, ma anche valori come .0a1, .99y, e così via. Se sai che quelle estensioni di file non saranno un problema nella tua situazione, questa potrebbe essere una buona alternativa.

Una soluzione diversa potrebbe essere quella di rendere la propria implementazione di OpenFileDialog con supporto per le espressioni regolari come filtro. Questa sarebbe la migliore soluzione in termini di prestazioni e sicurezza, ma non so quanto sarà difficile.

+0

Grazie per questo suggerimento, utilizzando il "??" è sufficiente nel mio caso. – user2332131

0

Ho provato a fare funzionare il OpenFileDialog e sembra di correre veloce nel mio caso:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    sb.Append("*."); 
    sb.Append(i.ToString("000")); 
    sb.Append("|"); 
} 
sb.Remove(sb.Length - 1, 1); 
string text = sb.ToString(); 

OpenFileDialog ofd = new OpenFileDialog(); 
ofd.Filter = "Files (" + text + ")|" + text; 
ofd.ShowDialog(this); 

ho usato StringBuilder per costruire il filtro. Quindi convertirlo in stringa e passarlo alla proprietà .Filter.

Giusto per assicurarsi che qui è un codice che fa 1000-voci nella casella di riepilogo Tipi di file:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    sb.Append("*."); 
    sb.Append(i.ToString("000")); 
    sb.Append("|"); 
} 
sb.Remove(sb.Length - 1, 1); 
string text = sb.ToString(); 

OpenFileDialog ofd = new OpenFileDialog(); 
ofd.Filter = text; 
ofd.ShowDialog(this); 
+0

Anche con un 'StringBuilder', questo codice impiega 20 secondi qui. –

+0

Inoltre, il codice ha un comportamento diverso rispetto al codice OP. –

+0

Ho modificato il ciclo for per creare il filtro con il simbolo pipe (senza la parola 'Test'), nel mio caso è in esecuzione veloce nella mia macchina. Mi chiedo qual è la differenza. –

-2

è possibile aggiungere la seguente riga.

dialog.AutoUpgradeEnabled = false; 

Questa proprietà del OpenFileDialog sarà impostare se il dialogo dovrebbe aggiornare il suo comportamento e l'aspetto durante l'esecuzione su Vista o superiore. Impostandolo su false rendiamo più semplice la visualizzazione dell'interfaccia utente che rende più veloce la finestra di dialogo.

Questo il codice che ho provato:

OpenFileDialog dialog = new OpenFileDialog(); 
StringBuilder text = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    text.Append("*." + i.ToString("000") + "; "); 
} 

string textWithoutLastSemicolumn = text.ToString().Substring(0, text.ToString().Length - 2); 
dialog.AutoUpgradeEnabled = false; 
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn; 
dialog.ShowDialog(); 

ho thsi aggiunto caricare caso di vuoto Windows Form

+2

Potrebbe essere necessario includere ciò che effettivamente fa e perché questo risolve il problema – derape

+0

No, non lo rende più veloce. Effettivamente testato e non aiuta in questo caso. –

+0

Devo pubblicare il codice che ho provato? Funziona per me – Abhishek