2008-12-24 38 views
8

Có cách nào dễ dàng để thêm các nút vào điều khiển WinView của TreeView .NET nơi các nút mới được thêm vào được chèn vào chỉ mục chính xác để toàn bộ danh sách các nút được sắp xếp theo thứ tự bảng chữ cái không? Khá nhiều có kết quả tương tự như TreeView.Sort().Sắp xếp TreeView Tự động khi thêm các nút

Tôi có TreeView liên tục phát triển đến vài trăm nút. Người dùng có thể xem TreeView này trong thời gian thực khi nó phát triển. Tôi muốn chỉ cần chèn các nút tại chỉ mục chính xác, thay vì gọi TreeView.Sort() mỗi lần sau khi một nút được thêm vào.

Việc này có thể thực hiện được không?

Trả lời

24

Trong winforms, bạn có thể chỉ cần đặt thuộc tính .Sorted của TreeView thành True.

Khi Sắp xếp được thiết lập là true, các đối tượng TreeNode đều được sắp xếp trong thứ tự chữ cái bởi các giá trị thuộc tính Text của họ. Bạn nên luôn sử dụng BeginUpdate và EndUpdate để duy trì hiệu suất khi thêm số lượng lớn số mục vào sắp xếp TreeView. Khi văn bản của nút hiện tại bị thay đổi, bạn phải gọi đến Sắp xếp để đỗ các mục.

Ref MSDN

+8

Điều thú vị đủ (với tôi ít nhất) là thuộc tính .Sorted không hiển thị trong danh sách thuộc tính VS cho TreeView cũng như trong Intellisense. Có lẽ đó là một sự giám sát. Các tài liệu MSDN, như bạn đã chỉ ra, đề cập rõ ràng nhưng rất nhiều lần tôi có xu hướng "nhấn phím dấu chấm" để truy cập các thuộc tính ban đầu và sau đó kiểm tra tài liệu nếu tôi không thấy những gì tôi đang tìm kiếm. Ban đầu tôi bỏ qua tài sản được phân loại đó và nó chắc chắn đã tạo ra sự khác biệt về hiệu quả phân loại danh sách. Cài đặt nhanh hơn nhiều.Được sắp xếp thành true ban đầu hơn gọi Sort() sau đó. – itsmatt

+1

Đối với tôi, nó cũng không hiển thị trong danh sách thuộc tính, nhưng mã hóa thủ công cũng hoạt động - tree.Sorted = true –

+2

Sử dụng http://msdn.microsoft.com/en-us/library/system.windows.forms. treeview.treeviewnodesorter.aspx nếu bạn muốn đặt trình sắp xếp –

5

Tại sao bạn không tạo các lớp mới kế thừa từ TreeViewTreeNodeCollection? TreeView mới sẽ sử dụng TreeNodeCollection mới và bạn có thể ghi đè phương thức Add() của TreeNodeCollection để thực hiện những gì bạn đang đề xuất.

Phương pháp sẽ phải: 1. Tìm vị trí chính xác để chèn vào và 2. Chèn nút mới.

Việc triển khai nhỏ nhất sẽ lặp qua bộ sưu tập cho đến thisNode.value<=newNode.value<nextNode.value. Sau đó chèn trước nextNode.Index. Bạn có thể thấy hiệu suất tăng nếu bạn sử dụng thuật toán tìm kiếm khác, tùy thuộc vào kích thước của bộ sưu tập. (Một cái gì đó giống như tìm kiếm nhị phân xuất hiện trong đầu bạn.)

Lưu ý: Bạn cũng có thể chỉ cần tạo phương thức tiện ích mở rộng trên TreeNodeCollection thực hiện tương tự. Tuy nhiên, ghi đè phương pháp Add() đảm bảo rằng TreeView của bạn là luôn được phân loại. Chỉ tạo phương thức tiện ích mở rộng có thể dẫn đến kết quả không xác định nếu nó chưa được sắp xếp trước cuộc gọi AddIntoSorted() của bạn.

+1

Điều này có thể đã dễ dàng thay đổi kể từ khi bài viết của bạn là 6 tuổi, nhưng có vẻ như bạn không thể phân lớp 'TreeNodeCollection' bây giờ. Nó có một [hàm tạo với trình sửa đổi truy cập 'nội bộ'.] (Http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeNodeCollection.cs) –

+2

@DarrenHale Thú vị. Và khó chịu, vì tôi đoán bạn sẽ phải tái tạo lại bánh xe sau đó làm cho 'TreeView' mới của bạn sử dụng bộ sưu tập mới. Cảm ơn cho những người đứng đầu lên. –

Các vấn đề liên quan