2010-08-26 24 views
5

Tôi có một thư mục có số lượng tệp lớn bên trong nó. Tôi muốn có thể hiển thị từng tệp của tôi dưới dạng nút. Và khi tôi bấm vào nút một cái gì đó sẽ xảy ra.làm cách nào để làm cho ứng dụng của tôi nhanh như trình khám phá cửa sổ để hiển thị các tệp

private void Form1_Load(object sender, EventArgs e) 
    { 
     int x = 10; 
     int y = 10; 

     /// Process the list of files found in the directory. 
     string[] fileEntries = Directory.GetFiles(@"c:\lotsofDocs"); 
     foreach (string fileName in fileEntries) 
     { 
      // do something with fileName 
      Button newbotton = new Button(); 
      newbotton.AutoSize = true; 
      newbotton.Text = fileName; 
      panel1.Controls.Add(newbotton); 
      newbotton.Location = new Point(x, y); 
      x += 150; 
      if (x == 760) 
      { 
       y += 50; 
       x = 10; 
      } 
     } 

Như bạn thấy không có gì điên trong mã. Tôi có một bảng điều khiển trên một biểu mẫu và tôi đã đặt tự động cuộn trên bảng điều khiển thành true và auto size thành false. Điều này làm cho biểu mẫu để duy trì kích thước và các nút (một số trong số họ anyway) để có được kết xuất khỏi biểu mẫu và tôi có thể cuộn xuống chúng.

Tất cả đều tốt cho đến nay.

Nếu tôi có 100 hoặc 200 tệp, mọi thứ đều ổn, nếu tôi có 1932 tệp cần khoảng 10 giây để hiển thị tất cả các nút.

Tôi đã đọc câu hỏi theo sau Super slow C# custom control và tôi hiểu rằng cách tiếp cận tôi đang sử dụng có thể không phải là cách tốt nhất để sử dụng tại đây.

Và bây giờ câu hỏi cuối cùng: trình duyệt Windows Explorer xử lý việc này như thế nào? Nếu tôi mở thư mục này trong Windows explorer nó sẽ mở ra ngay lập tức. Loại trình điều khiển windows explorer sử dụng là gì? Hay là nó làm theo cách hoàn toàn khác với tôi.

Cảm ơn

+2

Tại sao không "nhanh như Chrome"? http://www.youtube.com/watch?v=4viKjxJqId0 –

+2

Tôi nghi ngờ Windows Explorer đang sử dụng .NET. Nó có một sự tiếp cận sâu hơn vào hệ thống và đã được tối ưu hóa qua nhiều lần lặp lại của chính nó trong nhiều năm. – David

+2

@Hamish Grubijan ... Windows "Máy tính để bàn" thám hiểm, không phải Windows "Internet" thám hiểm! (Ảnh đáng sợ bằng cách này). –

Trả lời

5

Danh sách điều khiển rất dài thường được thực hiện thông qua điều khiển ảo hóa. Điều đó có nghĩa rằng nếu chỉ có 20 nút phù hợp trên màn hình, nó chỉ tạo ra 20 nút hoặc hơn. Khi bạn di chuyển xung quanh nó reuses 20 nút cùng với dữ liệu mới trong đó.

Điều khiển có thể rất chậm để tạo và quản lý với số lượng lớn vì chúng thường được thêm vào danh sách hoặc phân cấp đơn giản (và khá phức tạp riêng lẻ).

Tự động quản lý một nhóm nút nhỏ hơn để hiển thị danh sách dữ liệu rất dài. Công việc rõ ràng hơn, nhưng kết quả cuối cùng nhanh như chớp so với "cách đơn giản".

Nếu bạn không muốn DIY, hãy thử kiểm soát của bên thứ ba. Ví dụ: Telerik được ảo hóa Cây, Danh sách các điều khiểnLưới có thể hiển thị một triệu bản ghi không bị chậm lại. Take a look at their Winforms grid here

0

Bạn có thể phân bổ tất cả các nút cùng một lúc không? Ý tôi là, tạo một mảng các nút sau khi bạn đọc tên tệp (vì vậy bạn biết có bao nhiêu nút để tạo), sau đó chỉ cần đặt thuộc tính của chúng trong vòng lặp. Tôi không biết nó sẽ tăng tốc bao nhiêu, nhưng nó đáng để thử. Bạn cũng có thể thấy nếu có một ghi đè trên phương thức Add của bảng điều khiển có một mảng hoặc danh sách các điều khiển và thêm tất cả cùng một lúc, quá.

+0

Tôi đã thử sử dụng phương thức addRange nhưng đáng ngạc nhiên là nó bị chậm hơn: ( – AidanO

2

Bạn nên xem số ListView. Nó cung cấp cùng một bộ chức năng cơ bản như vùng tệp trong Windows Explorer với hiệu suất tương đương.

Đảm bảo gọi BeginUpdate trước khi thêm các mục của bạn và EndUpdate khi bạn hoàn tất để có hiệu suất tốt nhất. Thêm các mục của bạn với Items.AddRange cũng tốt cho hiệu suất.

0

Một thủ thuật thường giúp cải thiện hoạt động xây dựng/thay đổi chậm là che giấu các điều khiển và/hoặc vùng chứa mẹ liên quan.Trong trường hợp của bạn, điều đó có nghĩa là ẩn panel1 trước khi tạo các điều khiển và hiển thị lại sau đó. Có thể không giúp ích gì trong trường hợp của bạn, nhưng nó đáng để thử.

Tuy nhiên, bạn sẽ gặp sự cố cơ bản tạo nhiều điều khiển trong Win32 hoặc WinForms. Mặc dù Hệ thống cửa sổ hiện tại có thể xử lý những điều này, nhưng đó không phải là điều cố gắng làm tốt.

Nó cũng không phải là giao diện người dùng tốt nhất cho điều đó. 2000 Các nút trong ma trận 5 x 400? Thánh bò. I không muốn sử dụng. Bạn sẽ làm gì nếu tên tệp không phù hợp với 150 pixel? Bạn làm gì trên màn hình "150" có nghĩa là "0,15 mm"?

Giải pháp thay thế
Tại sao không kiểm soát danh sách? Điều đó ít nhất có trang lên/xuống trang và nhập trước để tìm các mục bắt đầu bằng văn bản tôi nhập. Đưa vào bộ điều khiển chỉnh sửa "bộ lọc nhanh" trên đầu trang, nơi mà một số văn bản lọc ra bất kỳ tệp nào không chứa nó và bạn có giao diện chuẩn có thể được sử dụng hiệu quả. Nếu bạn mong đợi nhiều mục, bạn có thể đặt điều khiển LitView vào chế độ ảo. Mặc dù điều này làm mất một số tính năng được tích hợp sẵn (ví dụ: tự động hóa cột), nhưng nó hoạt động với số lượng mục điên được ném vào đó.

Bạn cũng có thể hiển thị các nút dưới dạng liên kết HTML và hiển thị nó trong điều khiển trình duyệt. Điều đó không nhất thiết phải nhanh hơn, nhưng HTML hiển thị dần dần, tôi có thể sử dụng danh sách trong khi bạn vẫn đang cung cấp các mục.

+0

Tôi đã cố đặt trạng thái bảng có thể hiển thị thành sai và trong khi thêm các nút nhanh hơn, hầu như tất cả thời gian tôi đã lưu để thực hiện – AidanO

+0

ah ... sẽ rất tuyệt. Vì vậy, bạn có thể đã đi xem danh sách? – peterchen

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