2011-10-03 2 views
7

Ho un DataGridView con una colonna checkbox. Sto provando a creare un pulsante seleziona/deseleziona tutto. Il codice per cambiare i valori è abbastanza facile, ma le prestazioni sono orrende.Colonna casella di controllo DataGridView "seleziona tutto" prestazioni

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells["Selected"].Value = _selectAll; 
} 

_selectAll è semplicemente una variabile bool toggle. C'è un modo migliore per farlo dove le prestazioni sono veloci? Ho provato anche a modificare il valore nel DataTable sottostante. Occorrono ancora alcuni secondi per poche centinaia di righe, ma la maggior parte del lavoro verrà eseguita su migliaia di righe.

EDIT & SOLUZIONE (2011/10/4)

Il problema principale era nelle proprietà DGV. Una volta ho impostato,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

prestazioni notevolmente migliorate (per MSDN DataGridView Performance). Le soluzioni suggerite in questa modifica migliorerebbero anche leggermente le prestazioni.

+1

Provare ad accedere alla colonna per indice anziché per nome. per esempio. 'dgv.Rows [i] .Cells [1] .Value = _selectAll;' –

+0

Hai una griglia limitata a qualsiasi proprietà o semplicemente la dai dal codice sottostante? –

+1

Sei sicuro che sia qui il collo della bottiglia? Io penso che sia altrove. –

risposta

6

Grazie mille, impostando la proprietà AutoSizeColumnsMode

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

le prestazioni è molto meglio ...

0

Non sono sicuro se si otterrà un incremento delle prestazioni o no, ma qualcosa di diverso si può provare:

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv["Selected", i].Value = _selectAll; 
} 
0

Invece di dare il nome di colonna GridView, u può specificare quale colonna appartiene to.This sarà lavorare più velocemente. Spero che sia d'aiuto.

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
1

Bene, questo è un problema comune.
Per prima cosa, è stata modificata l'elaborazione associata alla casella di controllo?
In tal caso, creare una variabile membro bool.
Inizializzarlo su falso prima di selezionare Seleziona tutto/Deseleziona tutto.
Nell'evento di controllo selezionato CheckBox -> verifica il valore del parametro bool.
Se viene fornito con ritorno falso dall'evento. Non elaborare nulla.
Dopo aver completato il ciclo per impostare la selezione tutto/Deseleziona tutto, elaborare l'evento di modifica selezionato, se necessario.
Non dimenticare di ripristinare il parametro bool su true after for loop.

bool _allowProcessing = false; 
//SelectAll/Deselect All 
for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
_allowProcessing = true; 
// Do some processing if required 

// Checked change event 
public void CheckBox_CheckedChange(object sender, eventArgs e) 
{ 
    if(!_allowProcessing) 
    return; 

    // Do Processing 
} 
+0

Questa sembra essere la soluzione più completa di quelle suggerite. Si prega di notare la modifica nella mia domanda che affronta il motivo principale per le scarse prestazioni. – Handprint

0

mi mostrano un altro modo per migliorare questo problema.
L'accesso alla vista datagrid direttamente come dgv.Rows[i].Cells["Selected"].Value rende la visualizzazione di dati lentamente.

Quindi, la modifica dell'origine dati e l'aggiornamento di datagridview rendono le prestazioni migliori se la propria vista datagrid ha origine dati e se il datasouce ha lo stato verificato.

foreach (var item in yourDataSource) 
{ 
    item.Checked = _selectAll; 
} 
dgv.Invalidate();