2011-10-03 62 views
7

我有一個DataGridView複選框列。我正在嘗試創建一個選擇/取消全選按鈕。用於更改值的代碼很簡單,但性能非常可怕。DataGridView複選框列「全選」性能

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

_selectAll只是一個切換bool變量。在性能快的地方有沒有更好的方法來做到這一點?我試着改變底層DataTable的值。對於幾百行來說,它仍然需要幾秒鐘,但大部分工作將在數千行上完成。

EDIT & SOLUTION(2011年10月4日)

的主要問題是在DGV性質。一旦我設置,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

性能顯着提高(每MSDN DataGridView Performance)。 在編輯時提出的解決方案也會稍微提高性能。

+1

嘗試按索引而不是按名稱訪問列。例如'dgv.Rows [i] .Cells [1] .Value = _selectAll;' –

+0

你有沒有任何屬性的網格或只是從背後的代碼給它? –

+1

你確定這是瓶頸嗎?我認爲這是其他地方。 –

回答

6

非常感謝,通過設置AutoSizeColumnsMode財產

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

的表現要好得多......

0

不知道你會得到性能的提升與否,而是別的東西,你可以嘗試:

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

而不是給GridView的列名,ü可以指定它所屬to.This將其列工作更快。希望能幫助到你。

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

好吧,這是一個常見問題。
首先,您是否有任何與複選框檢查更改相關的處理?
如果是這樣,請創建一個bool成員變量。
在執行全選/全部取消選擇之前將其初始化爲false。
在CheckBox中檢查更改事件 - >檢查bool參數的值。
如果它來自事件的虛假回報。不要處理任何東西。
完成for循環以設置全部選擇/全部取消選擇後,根據需要處理選中的更改事件。
不要忘記在for循環後將bool參數重置爲true。

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

這似乎是那些建議的最完整的解決方案。請注意我的問題中的編輯,其中解決了性能差的主要原因。 – Handprint

0

我展示另一種方式來改善這個問題。
直接訪問datagridview,如dgv.Rows[i].Cells["Selected"].Value,使datagridview緩慢。

因此,如果您的datagridview具有數據源並且datasouce檢查了狀態,那麼更改數據源和刷新datagridview可使匹配性能更好。

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