2011-10-03 26 views
7

Bir onay kutusu sütununa sahip bir DataGridView var. Tüm seç/çıkar seçimini oluşturmaya çalışıyorum. Değerleri değiştirmek için kod yeterince kolay, ancak performans korkunç.DataGridView onay kutusu sütunu "tümünü seç" performansı

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

_selectAll basitçe bir toggle bool değişkendir. Performansın hızlı olduğu yerde bunu yapmanın daha iyi bir yolu var mı? Altta yatan DataTable'daki değeri de değiştirmeyi denedim. Sadece birkaç yüz satır için hala birkaç saniye sürüyor, ancak çoğu iş binlerce satırda yapılacak.

DÜZENLEME & ÇÖZÜM (2011/10/4)

temel sorun DGV özelliklerinde oldu. I belirledikten sonra,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

performans (MSDN DataGridView Performance başına) önemli ölçüde arttı. Bu düzenleme ile önerilen çözümler, performansı biraz da artıracaktır.

+1

Sütuna ada yerine dizinle erişmeyi deneyin. Örneğin. dgv.Rows [i] .Cells [1] .Value = _selectAll; ' –

+0

Herhangi bir özelliğe sınırlanmış veya yalnızca arkasından gelen kodla ilgili grid var mı? –

+1

Şişe boynunun nerede olduğundan emin misiniz? Başka yerde olduğunu düşünüyor. –

cevap

6

sayesinde performansı çok iyidir AutoSizeColumnsMode, tesisi

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

ayarlayarak bir sürü ...

0

emin değil misiniz deneyebileceğiniz performans artışı ya da değil, ama başka bir şey çıkacak olursa: gridview kolon adını vermenin

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

Bunun yerine, u to.This olacak ait olduğu sütun belirtebilirsiniz daha hızlı çalış. Umarım yardımcı olur.

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

Bu genel bir sorundur.
İlk olarak, Checkbox işaretli değişiklikle ilişkili herhangi bir işleminiz var mı?
Öyleyse, bool üye değişkeni oluşturun.
Tümünü Seç/Seçimi Kaldır'ı gerçekleştirmeden önce onu false olarak başlat.
CheckBox işaretli değişiklik olayında -> bool paramterinin değerini kontrol edin.
Eğer olaydan yanlış geri dönüş geliyorsa. Hiçbir şey işlemeyin.
Tümünü seç/Tümünün Seçimini ayarlamak için for döngüsünü tamamladıktan sonra, gerekirse kontrol edilen değişiklik olayını işleyin.
Döngü için bool parametresini true olarak sıfırlamayı unutmayın.

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

Bu, önerilenlerin en eksiksiz çözümü gibi görünüyor. Sorunun, performansın asıl nedeninin ana nedenini ele alan düzenlemeye dikkat edin. – Handprint

0

bu sorunu iyileştirmek için başka bir yol göstermektedir.
Doğrudan dgv.Rows[i].Cells["Selected"].Value gibi datagridview'e erişme, datagridview öğesini yavaşça yapar.

Bu nedenle, veri kaynağı ve yenilenen datagridview öğelerini değiştirmek, datagridview'inizin veri kaynağı ve veri kaynağı durumu denetlenirse daha iyi bir performans sağlar.

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