0

在我的 Windows 窗体的 Form_Load 事件中,我想显示一个 FolderBrowserDialog 让用户选择一个目录,如果他们选择的目录无效(意味着它缺少应用程序需要的某些文件),我想再次显示它. 但是,当我创建一个新的 FolderBrowserDialog 时,当我调用 ShowDialog 时它不会出现。

while (ValidDirectorySelected() == false && tryAgain == true)
{
 using (FolderBrowserDialog dialog = new FolderBrowserDialog())
 {
  dialog.ShowNewFolderButton = false;

  if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
  {
   tryAgain = false;
  }
 }
}

当我踏入其中时,第二次到达 dialog.ShowDialog() 行,然后什么也没有发生。对话框不会出现,调试器也不会继续。它只是停止。它第一次完美运行,但不是第二次。我什至尝试复制整个 using 块并将其粘贴在第一个块之后,并且发生了同样的事情。该对话框仅显示一次。

我需要怎么做才能多次显示 FolderBrowserDialog?

解决方案:

将“this”传递给 ShowDialog 解决了我的问题。我还将 using 移到了 while 循环之外,以避免不必要地重新创建对话框。

4

2 回答 2

2

最小化 Visual Studio,你会发现对话框回来了。

这是一个焦点问题,因为您在 Load 事件中显示对话框而触发。当对话框关闭时,您的应用程序中将没有可以接收焦点的窗口。您的 Load 事件尚未完成运行,因此应用程序的主窗口尚不可见。Windows 必须找到一个窗口来提供焦点,并从另一个程序中选择一个。像 Visual Studio。

当您再次显示该对话框时,它无法夺回焦点,因为 Visual Studio 已经获得了它。因此,对话框出现Visual Studio 主窗口的后面,看不见。

您必须通过让主窗口可见来解决此问题。并调用 dialog.ShowDialog(this) 以完全确定。例如,您可以使用 Shown 事件。

于 2010-06-18T21:33:32.293 回答
1

尝试这个:

using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
    while (ValidDirectorySelected() == false && tryAgain == true)
    {
        dialog.ShowNewFolderButton = false;

        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
        {
            tryAgain = false;
        }
    }
}

...将您的 using 移到 while 循环之外,以免每次都破坏文件夹浏览器。你不必那样做。您可以重用 FolderBrowserDialog。

于 2010-06-18T21:08:53.367 回答