2015-08-04 18 views
5

Tôi cần có hộp thoại tập tin mở cho 1000 loại tệp (* .000 - * .999). Nhưng thêm nó vào bộ lọc, hộp thoại sẽ thực sự chậm khi chọn các loại tệp. Tôi có thể làm gì để tăng tốc độ này không?OpenFileDialog với nhiều phần mở rộng

string text; 
for (int i = 0; i <= 999; i++) 
{ 
    text.Append("*." + i.ToString("000") + "; "); 
} 

string textWithoutLastSemicolumn = text.ToString().Substring(0, text.ToString().Length - 2); 
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn; 
+0

bạn có bất kỳ lối tắt kết nối mạng nào không? – Abhishek

+1

Tôi có thể hỏi tại sao bạn muốn làm điều đó ngay từ đầu? o_O – derape

+1

Tôi sẽ tham gia bình luận @derape, mục đích của việc thêm rất nhiều tiện ích mở rộng để mở hộp thoại tệp là gì? '*. *' là đủ. Nếu bạn đang tạo các tệp đó, thì bạn không nên sử dụng * các tiện ích * khác nhau ở vị trí đầu tiên (thay vào đó bạn có thể thay đổi tên tệp). Bạn có thể thêm vài tiện ích mở rộng, nhưng không phải là 1000. – Sinatr

Trả lời

5

Nếu bạn đang mắc kẹt với những tiện ích, tôi có thể thấy 2 giải pháp khả thi. Hoặc chấp nhận khá nhanh, nhưng không phải 100% đúng giải pháp này:

ofd.Filter = "Supported extensions | *.0??;*.1??;*.2??;*.3??;*.4??;*.5??;*.6??;*.7??;*.8??;*.9??"; 

này sẽ chấp nhận tất cả các phần mở rộng của bạn, mà còn đánh giá cao như .0a1, .99y, và vân vân. Nếu bạn biết những phần mở rộng tập tin đó sẽ không phải là một vấn đề trong tình huống của bạn, điều này có thể là một lựa chọn tốt.

Một giải pháp khác có thể là tự mình triển khai OpenFileDialog với sự hỗ trợ cho cụm từ thông dụng làm bộ lọc. Đây sẽ là giải pháp tốt nhất về hiệu năng và bảo mật, nhưng tôi không biết nó sẽ khó như thế nào.

+0

Cảm ơn gợi ý này, sử dụng "??" là đủ trong trường hợp của tôi. – user2332131

0

Tôi đã cố gắng chạy OpenFileDialog và có vẻ như để chạy nhanh trong trường hợp của tôi:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    sb.Append("*."); 
    sb.Append(i.ToString("000")); 
    sb.Append("|"); 
} 
sb.Remove(sb.Length - 1, 1); 
string text = sb.ToString(); 

OpenFileDialog ofd = new OpenFileDialog(); 
ofd.Filter = "Files (" + text + ")|" + text; 
ofd.ShowDialog(this); 

Tôi đã sử dụng StringBuilder để xây dựng các bộ lọc. Và sau đó chuyển đổi nó thành chuỗi và truyền cho nó thuộc tính .Filter.

Chỉ cần chắc chắn rằng đây là một mã mà làm cho 1000 mục trong các loại tập tin listbox:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    sb.Append("*."); 
    sb.Append(i.ToString("000")); 
    sb.Append("|"); 
} 
sb.Remove(sb.Length - 1, 1); 
string text = sb.ToString(); 

OpenFileDialog ofd = new OpenFileDialog(); 
ofd.Filter = text; 
ofd.ShowDialog(this); 
+0

Ngay cả với một 'StringBuilder', mã này mất 20 giây ở đây. –

+0

Ngoài ra, mã của bạn có một hành vi khác nhau mà mã của OP có. –

+0

Tôi đã sửa đổi vòng lặp for để xây dựng bộ lọc có ký hiệu ống (không có từ 'Kiểm tra'), trong trường hợp của tôi nó đang chạy nhanh trong máy của tôi. Tôi tự hỏi sự khác biệt là gì. –

-2

Bạn có thể thêm dòng sau.

dialog.AutoUpgradeEnabled = false; 

Thuộc tính này của OpenFileDialog sẽ đặt xem hộp thoại có nên nâng cấp hành vi và ngoại hình của nó khi chạy trên vista trở lên hay không. Bằng cách đặt nó thành false, chúng tôi đang làm cho giao diện người dùng đơn giản hơn giúp cho hộp thoại nhanh hơn.

này mã tôi đã cố gắng:

OpenFileDialog dialog = new OpenFileDialog(); 
StringBuilder text = new StringBuilder(); 
for (int i = 0; i <= 999; i++) 
{ 
    text.Append("*." + i.ToString("000") + "; "); 
} 

string textWithoutLastSemicolumn = text.ToString().Substring(0, text.ToString().Length - 2); 
dialog.AutoUpgradeEnabled = false; 
dialog.Filter = "Files (" + textWithoutLastSemicolumn + ")|" + textWithoutLastSemicolumn; 
dialog.ShowDialog(); 

tôi thêm thsi để tải sự kiện của một sản phẩm nào Windows Form

+2

Có thể bạn nên bao gồm những gì thực sự làm và tại sao điều này khắc phục sự cố – derape

+0

Không, nó không làm cho nó nhanh hơn. Trên thực tế thử nghiệm nó và nó không giúp đỡ trong trường hợp này. –

+0

Tôi có nên đăng mã mà tôi đã thử không? Nó hoạt động cho tôi – Abhishek

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