如何使我的应用程序像Windows资源管理器一样快速地渲染文件

时间:2010-08-26 15:29:14

标签: c# windows optimization explorer

我有一个包含大量文件的文件夹。我希望能够将每个文件渲染为一个按钮。当我点击按钮时会发生一些事情。

 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;
            }
        }

正如您所看到的,代码中没有任何疯狂。我在表单上有一个面板,我在面板上设置自动滚动为true,自动大小为false。这会导致表单保持大小和按钮(其中一些仍然是)从表单渲染,我可以向下滚动到它们。

到目前为止一切都很好。

如果我有100或200个文件,一切正常,如果我有1932个文件,那么渲染所有按钮大约需要10秒钟。

我已经阅读了以下问题Super slow C# custom control,我理解我使用的方法可能不是最好用的。

现在问题是: windows explorer如何处理这个?如果我在Windows资源管理器中打开此文件夹,它会立即打开。 Windows资源管理器使用什么类型的控件?或者它是以完全不同的方式对我做的。

由于

4 个答案:

答案 0 :(得分:5)

很长的控件列表通常通过虚拟化控件实现。这意味着如果屏幕上只有20个按钮,那么它只会创建20个按钮。滚动时,它会重复使用相同的20个按钮,其中包含新数据。

创建和管理大量的控件可能非常慢,因为它们通常会添加到简单的列表或层次结构中(并且非常复杂)。

最好自己管理一小组按钮,以显示很长的数据列表。显然有更多工作,但与“简单方式”相比,最终结果是闪电般快。

如果您不想DIY,请尝试第三方控件。例如,Telerik虚拟化列表网格控件可以显示一百万条没有减速的记录。 Take a look at their Winforms grid here

答案 1 :(得分:2)

您应该查看ListView。它提供与Windows资源管理器中具有相似性能的文件区域相同的基本功能集。

确保在添加项目之前致电BeginUpdate,并在完成最佳演出后致电EndUpdate。使用Items.AddRange添加项目也有助于提升效果。

答案 2 :(得分:0)

您可以一次分配所有按钮吗?我的意思是,在您读取文件名后创建一个按钮数组(因此您知道要创建多少个按钮),然后只需在循环中设置它们的属性。我不知道会加快多少,但值得一试。您可能还会看到面板的Add方法是否覆盖了一个数组或控件列表并同时添加它们。

答案 3 :(得分:0)

通常有助于改进缓慢的构造/更改操作的一个技巧是隐藏控件和/或所涉及的父容器。在您的情况下,这意味着在创建控件之前隐藏panel1,然后再次显示它。在你的情况下可能没什么帮助,但值得一试。

然而,您将遇到基本问题在Win32或WinForms中创建如此多的控件。虽然现在的窗口系统可以处理这些,但并不是想要擅长的东西。

它也不是最好的用户界面。 2000 x 5 x 400矩阵中的按钮?神圣的牛奶。 不想使用它。如果文件名不适合150像素,你会怎么做?你在“150”表示“.15 mm”的显示器上做什么?

<强>替代
为什么不进行列表控制?至少有页面向上/向下翻页,并提前键入以查找以我输入的文本开头的项目。在其上面放置一个“快速过滤器”编辑控件,其中输入一些文本过滤掉任何不包含它的文件,并且您有一个可以有效使用的标准界面。如果您期望很多项目,可以将LitView控件置于虚拟模式。虽然这会丢失一些内置功能(例如自动调整列),但它可以使用疯狂数量的项目。

您还可以将按钮呈现为HTML链接,并将其显示在浏览器控件中。这不一定更快,但HTML逐渐呈现,我可以在你还在喂食物品时使用这个列表。