Làm cách nào để dễ dàng lặp qua tất cả các nút trong TreeView, kiểm tra thuộc tính .Checked của chúng và sau đó xóa tất cả các nút đã chọn?Làm thế nào để xóa một cách hiệu quả các mục được kiểm tra từ một TreeView?
Có vẻ đơn giản, nhưng bạn không được phép sửa đổi bộ sưu tập mà qua đó bạn đang lặp lại, loại bỏ khả năng xảy ra vòng lặp "foreach". (The .Nodes.Remove gọi là sửa đổi bộ sưu tập.) Nếu điều này là cố gắng, hiệu quả là chỉ có khoảng một nửa các nút .Checked được loại bỏ.
Ngay cả khi người dùng sử dụng hai lần vượt qua: đầu tiên tạo danh sách các chỉ mục tạm thời và sau đó loại bỏ chỉ mục trên đèo thứ hai - các chỉ mục sẽ thay đổi theo từng loại bỏ, đánh giá tính toàn vẹn của danh sách chỉ mục.
Vì vậy, cách hiệu quả nhất để làm điều này là gì?
Dưới đây là một ví dụ về mã mà có vẻ tốt, nhưng thực chất chỉ loại bỏ khoảng một nửa số các nút .Checked .:
foreach (TreeNode parent in treeView.Nodes)
{
if (parent.Checked)
{
treeView.Nodes.Remove(parent);
}
else
{
foreach (TreeNode child in parent.Nodes)
{
if (child.Checked) parent.Nodes.Remove(child);
}
}
}
(Vâng, mục đích duy nhất là để prune nút từ một cái cây đó là hai Ở mức độ sâu.)
Đây là phương pháp hiệu quả nhất. – Romias
Câu hỏi cũ, nhưng +1 cho đây là phương pháp hiệu quả nhất. – TimFoolery
Xem lại điều này ... một vài sửa đổi sẽ làm cho nó nhanh hơn một chút ... tạo ra các thay đổi sau trong tiêu đề vòng lặp: 'int ndx = nodes.Count-1' và' ndx> = 0' sẽ cho phép bạn để tránh -1 xảy ra trong mỗi lần truyền qua vòng lặp. Trong kế hoạch lớn của sự vật, một vài phép trừ thêm sẽ không có ý nghĩa gì nhiều, nhưng hey ... tại sao không? – TimFoolery