如何在LINQPad中显示FolderBrowserDialog?

时间:2016-01-02 10:55:28

标签: c# linqpad

我想在LINQPad脚本中浏览一个文件夹,所以我尝试使用FolderBrowserDialog。它没有用。

这是一个显示我正在做什么的片段?

string path = "";
var browser = new FolderBrowserDialog { ShowNewFolderButton = false };
if (browser.ShowDialog() == DialogResult.OK)
{
    path = browser.SelectedPath;
}

这会在ShowDialog()的行上运行并挂起,黄色执行指针对着该行,但文件夹浏览器对话框不可见。

我知道ShowDialog()有一个重载需要一个IWin32Window owner参数,并认为这可能是解决方案,但尚未找到如何为主LINQPad窗口获取IWin32Window 。我希望Util类可以提供一种方法,但除非我错过了它,否则它似乎没有。

任何人都有解决这个问题的建议吗?

3 个答案:

答案 0 :(得分:2)

Run each query in its own process选项设置为true是导致问题的原因。将该选项设置回默认值false允许上述代码按预期运行。

但是,进行此更改会禁用内置调试。此外,这种行为仍然存在一些问题。

首次运行脚本时,将显示对话框,并且在选择“确定”或“取消”后脚本将运行至完成。但是,在第二次运行脚本时,它会按照问题中的描述挂起。取消执行并再次运行后,对话框会显示,但之后的时间会再次挂起,依此类推。

有人指出,设置Always use fresh application domains选项可以解决这个问题,并允许在每次执行脚本时显示对话框。

答案 1 :(得分:1)

不是解决方案,而是FilePicker(新的LinqPad输入控件的一部分)。

您可以写:

new FilePicker().Dump().TextInput += (x, e) => ((FilePicker)x).Text.Dump();

或:

var picker = new FilePicker();
picker.TextInput += (x, e) => {
    var fileName = picker.Text;
    //action with the file...
};

答案 2 :(得分:0)

我刚遇到LINQPad 5的问题。我需要一个类似于文件选择器的文件夹选择器。您的解决方案无需我修改LINQPad5设置即可工作。问题是对话框停留在后台。因此,这就是我如何使您的代码片段集中处理该对话框的方法。我没有使用FolderBrowseDialog.ShowDialog(),而是使用了以Windows窗体传递的重载。我创建了一个具有描述和窗口位置的新表单,然后将其传递给ShowDialog。这样我就可以设置说明和窗口位置。

string path = "";
using ( var browser = new System.Windows.Forms.FolderBrowserDialog { ShowNewFolderButton = false })
{
    browser.Description = "Select Folder For Foo Processing";
    var form = new System.Windows.Forms.Form(){TopMost = true, TopLevel = true};
    var result = browser.ShowDialog(form); 
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        path = browser.SelectedPath;            
    }       
}   
path.Dump();

我尝试使用设置在ShowDialog中初始化表单,但是遇到了问题,因此我选择在show dialog之前声明它。希望这对任何解决此问题的人都有帮助。