2009-04-28 37 views
7

Đây là System.Windows.Forms.TreeView, không phải WPF hoặc Web TreeView.Tải chậm TreeView trong .NET

Tôi phải thiếu điều gì đó, bởi vì tôi không thể tin rằng điều này là khó khăn.

Tôi đã có TreeView trên biểu mẫu của mình. Tải tất cả các dữ liệu để cư trú TreeView là rất chậm, vì vậy tôi muốn tải chỉ các nút cấp cao nhất và sau đó điền vào các trẻ em khi người dùng mở rộng các nút. Vấn đề là, nếu một nút không có con, nó không hiển thị dấu + bên cạnh nút, điều đó có nghĩa là nó không thể được mở rộng, có nghĩa là tôi không thể nắm bắt một sự kiện Mở rộng để tải các con .

Năm trước khi tôi đang sử dụng PowerBuilder, bạn sẽ đặt thuộc tính HasChildren (hoặc tương tự) thành true 'lie' để điều khiển và buộc nó hiển thị dấu + và sau đó bạn có thể nắm bắt sự kiện Mở rộng. Tôi đã không thể tìm ra cách buộc một + xuất hiện trên một nút khi không có nút con.

Tôi đã thử phương pháp mà tôi thêm nút giả vào mỗi nút và sau đó mở rộng kiểm tra nếu nút giả hiện diện và xóa nó rồi tải trẻ em, nhưng vì nhiều lý do không đáng để vào đây giải pháp đó không khả thi trong tình huống của tôi.

Tôi đã Googled cho các kết hợp khác nhau của C#, treeview, bị hoãn, trì hoãn, tải, buộc, mở rộng và một vài thuật ngữ khác thoát khỏi tôi ngay bây giờ mà không có may mắn.

P.S. Tôi tìm thấy dự án TreeViewAdv trên SourceForge, nhưng tôi không muốn giới thiệu một thành phần mới vào môi trường của chúng tôi nếu tôi có thể tránh được nó.

+1

Tôi đã luôn sử dụng phương pháp nút giả; nó thường hoạt động khá tốt. Bạn có thể cho chúng tôi biết thêm về lý do tại sao nó không hoạt động cho bạn? – Charlie

Trả lời

4

tải 2 cấp độ đầu tiên lúc khởi động và tải 2 cấp độ xuống khi một nút được mở rộng.

0

Một giải pháp khả thi là để ở lại đi trước một bước của treeview:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // initialise the tree here 
    var nodeSomething = treeView1.Nodes.Add("Something"); 
    nodeSomething.Nodes.Add("Something below something"); 

    treeView1.AfterExpand += AfterExpand; 
} 

private void AfterExpand(object sender, TreeViewEventArgs e) 
{ 
    foreach (TreeNode node in e.Node.Nodes) 
    { 
     // skip if we have already loaded data for this node 
     if (node.Tag != null) 
      continue; 
     node.Tag = new object(); 
     node.Nodes.AddRange(GetDataForThisNode(node)); 
    } 
} 
0

Tôi cũng đã tự hỏi làm thế nào để có được + để hiển thị bên cạnh nút có con, nhưng tôi không bao giờ tìm thấy một cách tốt. Giải pháp của tôi là xử lý sự kiện MouseDoubleClick như vậy:

Private Sub tvwMain_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tvwMain.MouseDoubleClick 
    Dim oNode As TreeNode 

    oNode = tvwMain.GetNodeAt(e.X, e.Y) 

    If oNode IsNot Nothing Then 
     If oNode.Nodes.Count = 0 Then 
      'add children here 
     End If 
    End If 
End Sub 
2

Tôi đồng ý với Chris, tôi phải làm điều này thay đổi. Tải các nút trên cùng và sau đó nắm bắt sự kiện nhấp chuột, đảm bảo nhấp chuột vào nút đã chọn và sau đó điền vào nút rồi cuối cùng mở rộng nút đó.

Nếu được yêu cầu có dấu cộng, hãy tải các nút trên cùng và thả nút giả vào đó. Đảm bảo bạn nắm bắt sự kiện nhấp hoặc mở rộng, xóa các nút và sau đó lặp lại nó.

+2

Tôi thứ hai ý tưởng nút giả. Tôi đang sử dụng bản thân mình và đặt thuộc tính Thẻ thành giá trị cụ thể để phân biệt các nút giả "Đang tải ..." từ các nút khác. Trong BeforeExpand, tôi kiểm tra sự tồn tại của nút giả và thay thế nội dung. Nó hoạt động tốt cho tôi. –

0

Bạn đã thử bao gồm các nút bổ sung của mình trong các cuộc gọi BeginUpdate()EndUpdate()? Điều này vô hiệu hóa bất kỳ bức tranh nào và như vậy cho phép bạn thêm một số lượng lớn các nút vào TreeView mà không có sự chậm trễ đáng kể.

MSDN: TreeView.BeginUpdate Method

+0

tôi nghĩ rằng OP có nghĩa là tải dữ liệu chính nó (từ DB, ví dụ) là chậm, không thêm các nút cây, vì vậy họ muốn tải dữ liệu theo yêu cầu (khi người dùng mở rộng mỗi nút cây). – Lucas

+0

Nhận xét của Lucas là chính xác. Bản thân TreeView có đủ nhanh, nó nhận được dữ liệu chậm. –

0

Bạn có thể có may mắn hơn bằng cách sử dụng TreeViewAdv (trên sourceforge).

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