2011-10-03 43 views
7

Tôi có một cột DataGridView với một cột hộp kiểm. Tôi đang cố gắng tạo một nút chọn/bỏ chọn tất cả. Mã để thay đổi các giá trị là dễ dàng, nhưng hiệu suất là khủng khiếp.Cột hộp kiểm DataGridView "chọn tất cả" hiệu suất

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

_selectTất cả chỉ đơn giản là biến bool chuyển đổi. Có cách nào tốt hơn để thực hiện điều này khi hiệu năng hoạt động nhanh không? Tôi đã thử thay đổi giá trị trong DataTable cơ bản là tốt. Nó vẫn mất vài giây chỉ với vài trăm hàng, nhưng hầu hết công việc sẽ được thực hiện trên hàng ngàn hàng.

EDIT & SOLUTION (2011/10/4)

Vấn đề chính là trong các thuộc tính DGV. Khi tôi đã đặt,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

hiệu suất được cải thiện đáng kể (mỗi MSDN DataGridView Performance). Các giải pháp được đề xuất khi chỉnh sửa này cũng sẽ cải thiện hiệu suất một chút.

+1

Thử truy cập cột theo chỉ mục thay vì theo tên. ví dụ. 'dgv.Rows [i] .Cells [1] .Value = _selectAll;' –

+0

Bạn có lưới bao quanh bất kỳ thuộc tính nào hay chỉ đưa nó từ mã phía sau? –

+1

Bạn có chắc chắn đó là nơi cổ chai? Tôi nghĩ nó ở nơi khác. –

Trả lời

6

Cảm ơn rất nhiều, bằng cách thiết lập AutoSizeColumnsMode tài sản

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

hiệu suất tốt hơn nhiều ...

0

Không chắc chắn nếu bạn sẽ nhận được một tăng hiệu suất hay không, nhưng cái gì khác bạn có thể thử:

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

Thay vì đưa ra các tên cột GridView, u có thể chỉ định cột nó thuộc to.This sẽ làm việc nhanh hơn. Hy vọng nó giúp.

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

Vâng, đây là vấn đề thường gặp.
Trước tiên, bạn có bất kỳ quá trình xử lý nào liên quan đến thay đổi đã kiểm tra Hộp kiểm không?
Nếu có, hãy tạo biến thành viên bool.
Khởi tạo sai thành trước khi thực hiện Chọn tất cả/bỏ chọn tất cả.
Trong sự kiện thay đổi đã chọn CheckBox -> kiểm tra giá trị của tham số bool.
Nếu có sự trở lại sai từ sự kiện. Không xử lý bất cứ điều gì.
Sau khi hoàn thành vòng lặp for để đặt tất cả/Bỏ chọn tất cả, hãy xử lý sự kiện thay đổi đã chọn nếu cần.
Đừng quên đặt lại tham số bool thành true sau vòng lặp.

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

Đây dường như là giải pháp hoàn chỉnh nhất cho những người được đề xuất. Xin lưu ý rằng bản chỉnh sửa trong câu hỏi của tôi giải quyết lý do chính cho hiệu suất kém. – Handprint

0

tôi hiển thị một cách khác để cải thiện vấn đề này.
Truy cập datagridview trực tiếp như dgv.Rows[i].Cells["Selected"].Value làm cho việc tải dữ liệu từ từ trở nên chậm chạp.

Vì vậy, việc thay đổi nguồn dữ liệu và làm mới datagridview giúp phù hợp với hiệu suất tốt hơn nếu chế độ xem dữ liệu của bạn có nguồn dữ liệu và dữ liệu đã kiểm tra trạng thái.

foreach (var item in yourDataSource) 
{ 
    item.Checked = _selectAll; 
} 
dgv.Invalidate(); 
Các vấn đề liên quan