具有许多扩展的 OpenFileDialog

OpenFileDialog with many extensions

我需要为 1000 种文件类型 (*.000 - *.999) 打开文件对话框。 但是将它添加到过滤器中,对话框在选择文件类型时变得非常慢。我可以做些什么来加快速度吗?

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;

我已经尝试 运行 宁 OpenFileDialog 并且在我的情况下似乎 运行 很快:

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

我已经使用 StringBuilder 构建了过滤器。然后将其转换为字符串并传递给它 .Filter 属性.

只是为了确保这里有一段代码可以在文件类型列表框中输入 1000 个条目:

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

您可以添加以下行。

dialog.AutoUpgradeEnabled = false;

OpenFileDialog 的 属性 将设置当 运行 在 vi​​sta 或更高版本上时对话框是否应该升级它的行为和外观。通过将其设置为 false,我们使 UI 渲染更简单,从而使对话框更快。

这是我试过的代码:

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();

我将此添加到空 Windows 表单的 Load 事件中

如果您受困于这些扩展,我可以看到 2 种可能的解决方案。要么接受这个相当快但不是 100% 正确的解决方案:

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

这将接受您的所有扩展名,但也接受 .0a1.99y 等值。如果您知道这些文件扩展名在您的情况下不会成为问题,这可能是一个不错的选择。

另一种解决方案可能是自己实现 OpenFileDialog 并支持正则表达式作为过滤器。这将是性能和安全方面最好的解决方案,但我不知道它会有多难。