2011-10-03 3 views
7

확인란이있는 DataGridView 열이 있습니다. 선택/선택 취소 버튼을 만들려고합니다. 값을 변경하기위한 코드는 쉽지만 성능은 끔찍합니다.DataGridView 확인란 열 "모두 선택"성능

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

_selectAll은 단순히 토글 bool 변수입니다. 성능이 빠른 곳에서이 작업을 수행하는 더 좋은 방법이 있습니까? 기본 DataTable의 값을 변경하려고 시도했습니다. 단지 몇백 개의 행에 대해 몇 초가 걸리지 만 대부분의 작업은 수천 개의 행에서 수행됩니다.

EDIT & 용액 (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

확실하지 당신은 당신이 시도 할 수있는 성능 향상 여부,하지만 뭔가 다른거야 경우 : gridview에 열 이름을주는

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

을 대신 U는 빕니다을 할 속한 열을 지정할 수 있습니다 빠르게 작동합니다. 희망이 도움이됩니다.

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

글쎄, 이것은 일반적인 문제입니다.
먼저 체크 박스에 체크 된 변경 사항과 관련된 처리가 있습니까?
그렇다면 bool 멤버 변수를 만듭니다.
모두 선택/모두 선택 취소를 수행하기 전에이 값을 false로 초기화하십시오.
CheckBox에서 변경 사항 확인 -> bool 매개 변수의 값을 확인하십시오.
이벤트에서 false return이있는 경우. 아무것도 처리하지 마십시오.
for 선택/모두 선택 해제를 설정하는 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

나는이 문제를 개선하는 또 다른 방법을 보여줍니다.
dgv.Rows[i].Cells["Selected"].Value과 같이 datagridview에 직접 액세스하면 datagridview가 느리게 생성됩니다.

그래서 datagridview에 datasource가 있고 datasouce가 상태를 확인한 경우 datasource를 변경하고 datagridview를 새로 고치면 성능이 향상됩니다.

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