【问题标题】:Cannot import Microsoft.win32.OpenFileDialog无法导入 Microsoft.win32.OpenFileDialog
【发布时间】:2016-10-07 16:02:13
【问题描述】:

我无法使用 Win32 OpenFileDialog 类

我尝试了下面的示例代码,我直接从Microsoft Documentation 复制粘贴到我的方法中,但我收到错误 CS0246,因为编译器找不到 OpenFileDialog。

我尝试添加对 Win32 的引用,但找不到。

顺便说一句,我确实尝试使用 .NET OpenFileDialog 和 FolderBrowserDialog 类,但它们无法打开具有起始位置的文件夹,并且该选项对我的应用程序来说是绝对必要的。

我做错了什么?

这是我的代码。

// Configure open file dialog box
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

// Show open file dialog box
Nullable<bool> result = dlg.ShowDialog();

// Process open file dialog box results
if (result == true)
{
    // Open document
    string filename = dlg.FileName;
}

编辑:问题已解决(以下解决方案)

错误来自表单设计器。我最初在我的表单中放置了一个 FolderBrowserDialog 对象。默认情况下,Visual Studio 2015 创建一个将 RootFolder 设置为 Desktop 的对象。现在,即使您将 SelectedPath 设置为目标文件夹,FolderBrowserDialog 仍然会打开桌面文件夹而不是它。

所以我在我的事件处理程序中实例化了一个 FolderBrowserDialog 对象,并将 SelectedPath 设置为我的目标文件夹,而未设置 RootFolder。现在它就像一个魅力。

private void B_Browse_Click(object sender, EventArgs e)
{
        FolderBrowserDialog fbd = new FolderBrowserDialog();
        fbd.SelectedPath = MyTargetFolder;
        DialogResult result = fbd.ShowDialog();
        // do stuff
}    

谢谢大家,祝你有美好的一天:)

【问题讨论】:

  • .Net 库中的 OpenFileDialog 有一个 InitialDirectory 和 FolderBrowserDialog 有一个 RootFolder 两者都用于设置对话框的开始位置......在你的例子中也没有你设置开始的位置对话框的位置指出这在您的应用中是必要的。
  • RootFolder 只接受 Environment.SpecialFolder 类型的变量。至于 SelectedPath,不管你是否用 RootFolder 设置它都不起作用。顺便说一句,我没有在我的代码中添加一个开始位置,因为它首先不起作用,花了一整天的时间谷歌搜索并试图无济于事,所以在编译器抱怨后我没有更进一步。
  • 好吧,它确实适用于挑选文件,但不适用于文件夹。显然微软已经决定只允许通过 FolderBrowser 类选择文件夹,不幸的是你不能设置开始位置(StackOverflow 上的很多人都有同样的问题)

标签: c# .net winforms


【解决方案1】:

对于 WinForms,您应该使用 System.Windows.Forms.OpenFileDialog 对象。

【讨论】:

  • System.Windows.Forms.OpenFileDialog 不允许你选择一个文件夹(或者至少没有一些肮脏的黑客)
  • 那我很糟糕。我重新检查了一些东西。
  • 这就是FolderBrowserDialog 的用途。您可以使用RootFolder 设置初始目录。或SelectedPath.
【解决方案2】:

确保您的using System.Windows.Forms 声明存在。

那么就真的很简单了:

OpenFileDialog dlg = new OpenFileDialog();
dlg.FileName = "Document";
dlg.DefaultExt = ".txt";
dlg.Filter = "Text documents (.txt)|*.txt";


Nullable<bool> result = dlg.ShowDialog(); 
// I get an error on this "cannot implicitly convert"
DialogResult result = dlg.ShowDialog();


if (result == true) //doesn't work with DialogResult
{
string filename = dlg.FileName;
}

老实说,这有很多问题。请参阅this is another stack article related.希望这会有所帮助。

【讨论】:

  • OpenFileDialog 不允许您选择文件夹。我在 SO 上发现了一个 hack,即将 CheckFileExists 和 ValidateNames 设置为 false 并将 CheckPathExists 设置为 true,但这并没有解决问题。我必须设置一个文件名,但用户可能会错误地删除它并且无法选择文件夹。
  • 你想打开什么?如果您尝试捕获目录数据,则有不同的方法。
  • 我只是想在特定文件夹中选择一个子文件夹。理想情况下,它应该以旧的 OpenFileDialog 方式完成。无论如何,我终于解决了这个问题,我正在编辑我的问题以发布解决方案,以防其他人遇到同样的问题。无论如何谢谢:)
【解决方案3】:

您可以使用 FolderBrowseDialog 设置开始文件夹,问题是树视图不会滚动到它,请参阅引用的 SO Question。

Why FolderBrowserDialog dialog does not scroll to selected folder?

        FolderBrowserDialog fbd = new FolderBrowserDialog();
        fbd.RootFolder = Environment.SpecialFolder.MyComputer;
        fbd.SelectedPath = @"C:\SomeFolder\";
        fbd.ShowDialog();

【讨论】:

  • 试过(再次),没有用。这才是真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2012-12-21
  • 1970-01-01
  • 2021-11-20
  • 2012-09-01
  • 2017-01-13
相关资源
最近更新 更多