在我的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()行,然后没有任何反应。该对话框不会出现,调试器不会继续。它就停止了。它第一次完美运行,但不是第二次。我甚至尝试过只复制整个使用块并在第一个之后粘贴它,同样的事情发生了。该对话框只显示一次。
如何多次显示FolderBrowserDialog需要做什么?
解决方案:
将'this'传递给ShowDialog解决了我的问题。我还将使用移到了while循环之外,以避免不必要地重新创建对话框。
答案 0 :(得分:2)
最小化Visual Studio,您将找到对话框。
这是一个焦点问题,因为您在Load事件中显示对话框而触发。对话框关闭后,您的应用中没有可以接收焦点的窗口。您的Load事件尚未完成运行,因此应用程序的主窗口尚不可见。 Windows必须找到一个窗口来关注焦点并从另一个程序中选择一个窗口。像Visual Studio一样。
再次显示对话框时,由于Visual Studio已获取焦点,因此无法将焦点恢复。因此,对话框在 Visual Studio的主窗口后面显示,不在视图中。
您必须通过允许主窗口变为可见来解决此问题。并调用dialog.ShowDialog(this)来完全确定。例如,您可以使用Shown事件。
答案 1 :(得分:1)
试试这个:
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
{
while (ValidDirectorySelected() == false && tryAgain == true)
{
dialog.ShowNewFolderButton = false;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
{
tryAgain = false;
}
}
}
...在while循环外移动你的使用,以防止每次都破坏文件夹浏览器。你不必那样做。您可以重复使用FolderBrowserDialog。