如何配置OpenFileDialog选择文件夹?


250

在VS .NET中,当您为项目选择文件夹时,将显示一个对话框,看起来像一个OpenFileDialog或SaveFileDialog,但设置为仅接受文件夹。自从我看到这一点以来,我一直想知道它是如何完成的。我知道FolderBrowserDialog,但我从未真正喜欢过该对话框。它开始时太小,不能让我利用能够输入路径的优势。

我几乎可以肯定的是,目前尚无从.NET执行此操作的方法,但我也很好奇您也如何从非托管代码中执行此操作。缺少从头开始完全重新实现对话框的方法,如何修改对话框以具有此行为?

我还想重申一下,我知道FolderBrowserDialog,但有时我不喜欢使用它,除了真正好奇如何以这种方式配置对话框。告诉我只使用FolderBrowserDialog可以帮助我保持一致的UI体验,但不能满足我的好奇心,因此它不会被视为答案。

这也不是Vista特有的;自VS .NET 2003以来,我一直在看到此对话框,因此它在Win2k和WinXP中是可行的。这不是一个“我想知道执行此操作的正确方法”的问题,而更多的是“自从我第一次在VS 2003中开始做以来,我一直对此感到好奇”。我知道Vista的文件对话框可以执行此操作,但是它在XP中一直在运行,因此我知道他们做了一些努力使其能够正常工作。Vista特定的答案不是答案,因为问题上下文中不存在Vista。

更新:我接受Scott Wisniewski的答案,因为它附带了一个有效的示例,但是我认为Serge值得赞扬的是他指出了对话框的自定义功能(虽然.NET 确实很讨厌,但它确实有效),而Mark Ransom则指出了MS可能为此任务滚动了一个自定义对话框。


7
从CodeProject只是一个简单的解决方案 codeproject.com/Articles/44914/... [关键要获得的OpenFileDialog选择文件和文件夹是设置ValidateNames和CheckFileExists属性设置为false(dialog.ValidateNames = FALSE; dialog.CheckFileExists =假)并将FileName设置为某些特殊关键字,以确保选择了文件夹(dialog.FileName =“ Folder Selection”;)。]

3
将此作为答案提交,它为我的项目完成了工作。
CigarDoug

@Riju dialog.FileName = "Folder Selection"应该处于拖延dialog.FileName = "Folder Selection."期?无论如何,我无法通过“打开”的第二次单击在Powershell中使用它。它一直说找不到文件,即使CheckFileExists据说是假的
同志Joecool

nvm,在powershell设置中dialog.CheckFileExists = 0代替false解决了我的问题
同志Joecool

Answers:


57

我有一个编写的对话框,称为OpenFileOrFolder对话框,该对话框可让您打开文件夹或文件。

如果将其AcceptFiles值设置为false,则它仅在接受文件夹模式下运行。

您可以在此处从GitHub下载源代码


4
非常有趣,而且绝对像我想像的那样复杂。是否有机会对其进行注释并指出其作用?这些以及其他评论使我相信MS可能只是滚动了自己的对话框。
OwenP

1
尝试构建您的解决方案时出现以下错误...不幸的是,c ++不是我的强项之一...错误1无法打开包含文件'afxres.h'。
Ignacio Soler Garcia

1
@SoMoS和其他存在相同问题的文件:在WindowsFormsApplication1.csproj文件中,编辑第100行,使其与您的设置匹配。就我而言,我必须将“ 9.0”更改为“ 10.0”(两次),并删除“(x86)”(两次)。
RenniePet

2
我下载了代码(zip),并在其中找到.h(C)文件,并进行了编译错误,例如无法打开包含文件'sal.h'。
雷杨

2
此解决方案也不适用于VS2010和VS2017!
AleX_

49

您可以使用FolderBrowserDialogEx-内置FolderBrowserDialog的可重用衍生物。这允许您键入一个路径,甚至是UNC路径。您也可以使用它浏览计算机或打印机。就像内置的FBD一样工作,但是更好。

(编辑:我应该指出,可以将此对话框设置为选择文件或文件夹。)

完整的源代码(一个简短的C#模块)。自由。MS-公共许可证。

使用它的代码:

var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
dlg1.Description = "Select a folder to extract to:";
dlg1.ShowNewFolderButton = true;
dlg1.ShowEditBox = true;
//dlg1.NewStyle = false;
dlg1.SelectedPath = txtExtractDirectory.Text;
dlg1.ShowFullPathInEditBox = true;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;

// Show the FolderBrowserDialog.
DialogResult result = dlg1.ShowDialog();
if (result == DialogResult.OK)
{
    txtExtractDirectory.Text = dlg1.SelectedPath;
}

7
很抱歉,如果我得罪了,问一个问题并说出“我想要这个特定的东西,而不是这些其他的东西”,让人们高高兴兴地提出未要求的东西,真是令人沮丧。我想要一个文件浏览器对话框,而不是文件夹浏览器对话框。
OwenP

15
问题的措辞方式对我来说听起来像是在询问文件夹选择器对话框-不是这样吗?无论如何,这正是我想要的+1
Tim

到目前为止,绝对是最好的答案
Vasil Popov

1
这并没有改变事实,答案仍然是仅链接的答案。当链接暂时或永久不可用时,显示如何使用托管在异地资源中的代码也不再有用。那里的规则是有原因的,并且这种贡献与那些规则相冲突。
IInspectable '18

1
我看着这个答案,它显然没有引用场外资源。因此,“其他所有答案”显然是错误的。如果您觉得我反应过度,也许您应该在meta上提出问题以讨论规则。我不会 我将应用它们。
IInspectable'3

48

有Windows API代码包。它有很多与外壳相关的东西,包括CommonOpenFileDialog类(在Microsoft.WindowsAPICodePack.Dialogs名称空间中)。这是完美的解决方案-通常只显示文件夹的打开对话框。

这是一个如何使用它的示例:

CommonOpenFileDialog cofd = new CommonOpenFileDialog();
cofd.IsFolderPicker = true;
cofd.ShowDialog();

不幸的是,Microsoft不再提供此软件包,但是有几个人非正式地将二进制文件上传到NuGet。一个例子可以在这里找到。该软件包只是特定于Shell的东西。如果您需要它,则同一用户还可以使用其他几个软件包,这些软件包提供了原始软件包中提供的更多功能。


1
我不知道这在Windows API代码包中-感谢您指出这一点。
帕特里克·克鲁格

10
CommonOpenFileDialog类仅在Windows Vista或更高版本上存在,因此将在较旧的操作系统上引发异常
Rachel

1
您能告诉我如何引用Windows API代码包吗?
jeff

1
存档库已退役。,或如此链接表示。。可能是它的新地方吗?
默认值

3
顺便说一下,CommonOpenFileDialog类位于Microsoft.WindowsAPICodePack.Dialogs命名空间中(花了我一段时间才能找到它)。
morgb

35

Ookii.Dialogs包中包含的文件夹浏览器对话框,围绕新(Vista风格)托管的包装。在较旧的操作系统上,它也会正常降级。


2
太棒了,它是BSD风格的开放源代码!
罗曼·斯塔科夫

7
唯一的问题是,我不会让我使用.net Framework客户配置文件作为目标。
Kugel 2010年

2
非常好的解决方案。我认为这是最好的答案。正是我3年以来一直在寻找的东西。
塞缪尔

1
此解决方案的另一个问题:它不允许用户粘贴不存在的路径。相对较小,但仍然很可惜。
罗曼·斯塔科夫

1
那些想要-style文件夹对话框的人的最佳实用答案OpenFileDialog
AQUA

27

最好为此使用FolderBrowserDialog。

using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
    dlg.Description = "Select a folder";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show("You selected: " + dlg.SelectedPath);
    }
}

9
我知道最好使用FolderBrowserDialog。我很好奇无论如何。无论如何,FolderBrowserDialog会以多种方式发臭。即使在Vista中,它也没有位置栏。有趣的是,到目前为止,MS如何避免在3个VS版本中使用它。
OwenP

24
FolderBrowserDialog具有许多可用性问题。我不会考虑将其实际放在应用程序中。请参阅我的帖子,查找具有更好可用性的对话框
Scott Wisniewski

6
FolderBrowserDialog不允许:-在底部的文本字段中键入/粘贴完整路径-在Vista上使用“收藏夹链接”栏-在Vista上使用搜索
decasteljau

89
FolderBrowserDialog是UI的真正恐怖之处。
Mackenir'5

32
严重的是,人们,请不要再将此烦人的对话框添加到您的应用程序中。它具有非常差的UI,如先前的注释所突出显示。
罗曼·斯塔科夫

23

经过搜索的时间,我发现这个答案 leetNightShade工作的解决方案

我相信有三件事可以使此解决方案比其他所有解决方案好得多。

  1. 使用简单。 它只需要在项目中包含两个文件(无论如何都可以合并为一个)。
  2. 它回到了标准 在XP或更旧的系统上使用时, FolderBrowserDialog
  3. 作者授权将代码用于您认为合适的任何目的。

    这样就没有许可证,您可以随意使用和使用代码。

此处下载代码。


@MattDavis:我确认它可以在.NET Framework 4.0(标准版和客户端配置文件)上使用。只要确保您已将FolderSelectDialog.cs和Reflector.cs添加到项目中即可。不过有一件事……您正在Windows 8上运行吗?我在Win7电脑上进行了测试。
Alex Essilfie 2013年

@Alex Essilfie,您是对的。将其放入我的项目中,我一定做错了。为了清楚起见,我将删除之前的评论。
马特·戴维斯

尝试多种选择,并认为这是最好的选择。推荐。
贾德(Jaded)2014年

在Windows 10中为我工作。好的简单解决方案
David Wilton

必须尊重旧系统中的故障转移
Mike M

17

精确的音频复制在Windows XP上以这种方式工作。将显示标准文件打开对话框,但文件名字段包含文本“文件名将被忽略”。

只是在这里猜测,但是我怀疑每次对对话框进行重大更改时,字符串都会注入到组合框编辑控件中。只要该字段不是空白,并且对话框标志设置为不检查文件是否存在,就可以正常关闭对话框。

编辑:这比我想象的要容易得多。这是C ++ / MFC中的代码,您可以将其转换为您选择的环境。

CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();

编辑2:这应该是对C#的翻译,但是我不精通C#,所以如果它不起作用,请不要开枪。

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // openFileDialog1.FileName should contain the folder and a dummy filename
}

编辑3:最后,在Visual Studio 2005中查看了有问题的实际对话框(我之前没有访问权限)。它不是标准文件打开对话框!如果您检查Spy ++中的窗口并将它们与打开的标准文件进行比较,则会看到结构和类名不匹配。当您仔细观察时,还可以发现对话框内容之间的一些差异。我的结论是,Microsoft完全替换了Visual Studio中的标准对话框以提供此功能。我的解决方案或类似的解决方案将尽可能地接近您,除非您愿意从头开始编写自己的代码。


17

好,让我尝试连接第一个点;-)用Spy ++或Winspector播放一点,显示VS Project Location中的Folder文本框是标准对话框的自定义项。它与标准文件对话框(如“记事本”中的文件对话框)中的“文件名”文本框不同。

从那里开始,我认为VS隐藏了文件名和文件类型文本框/组合框,并使用自定义对话框模板在对话框底部添加了自己的部分。

编辑:这是这样的自定义以及如何执行此示例(在Win32。不是.NET):

m_ofn是文件对话框基础的OPENFILENAME结构。添加以下两行:

  m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
  m_ofn.Flags |= OFN_ENABLETEMPLATE;

其中IDD_FILEDIALOG_IMPORTXLIFF是自定义对话框模板,将添加到对话框底部。请参见下面红色部分。 (来源:apptranslator.com替代文字

在这种情况下,自定义部分仅是标签+超链接,但可以是任何对话框。它可能包含一个“确定”按钮,使我们可以验证仅文件夹选择。

但是我不知道该如何摆脱对话框标准部分中的某些控件。

此MSDN文章中有更多详细信息。


1
这听起来像是我过去听到的一些解释,但是我从未见过对该概念的演示。MSDN文档中是否有关于这样做的演练?
OwenP '02

10

您可以对文件对话框进行子类化,并访问其所有控件。每个都有一个可用于获取其窗口句柄的标识符。然后,您可以显示和隐藏它们,从中获取有关选择更改的消息等。所有这些都取决于您要付出多少努力。

我们使用WTL类支持来完成我们的工作,并自定义文件对话框以包括自定义位置栏和插件COM视图。

MSDN提供了有关如何使用Win32进行此操作的信息,此CodeProject文章包括一个示例,而此CodeProject文章提供一个.NET示例


10

您可以使用这样的代码

  • 筛选器是隐藏文件
  • 文件名是隐藏第一个文本

要高级隐藏文本框的文件名,您需要查看 OpenFileDialogEx

代码:

{
    openFileDialog2.FileName = "\r";
    openFileDialog1.Filter = "folders|*.neverseenthisfile";
    openFileDialog1.CheckFileExists = false;
    openFileDialog1.CheckPathExists = false;
}

简单,这正是Windows 7+所需要的
Hao Nguyen

标记中还需要OFN_NOVALIDATE
地精炼金术士

5

我假设您在使用VS2008的Vista上?在那种情况下,我认为调用Vista文件对话框IFileDialog时会使用FOS_PICKFOLDERS选项。恐怕在.NET代码中,这将涉及大量讨厌的P / Invoke互操作代码才能起作用。


1
Vista特定;我首先在Windows XP的VS 2003上看到了这一点。
OwenP

2

第一个解决方案

我将其开发为lyquidity.com的Bill Seddon (我没有从属关系)的.NET Win 7样式文件夹选择对话框的清理版本。(我从此页面上的另一个答案获悉了他的代码)。我写自己的书是因为他的解决方案需要一个额外的Reflection类,而该类不需要为此专门的目的而使用,它使用基于异常的流控制,并且不缓存其反射调用的结果。请注意,嵌套的静态类是这样的,因此,如果从不调用该方法,则其静态反射变量不会尝试填充。如果没有足够高的Windows版本,它将退回到Vista之前的对话框。理论上应该在Windows 7、8、9、10和更高版本中运行。VistaDialogShow

using System;
using System.Reflection;
using System.Windows.Forms;

namespace ErikE.Shuriken {
    /// <summary>
    /// Present the Windows Vista-style open file dialog to select a folder. Fall back for older Windows Versions
    /// </summary>
    public class FolderSelectDialog {
        private string _initialDirectory;
        private string _title;
        private string _fileName = "";

        public string InitialDirectory {
            get { return string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory; }
            set { _initialDirectory = value; }
        }
        public string Title {
            get { return _title ?? "Select a folder"; }
            set { _title = value; }
        }
        public string FileName { get { return _fileName; } }

        public bool Show() { return Show(IntPtr.Zero); }

        /// <param name="hWndOwner">Handle of the control or window to be the parent of the file dialog</param>
        /// <returns>true if the user clicks OK</returns>
        public bool Show(IntPtr hWndOwner) {
            var result = Environment.OSVersion.Version.Major >= 6
                ? VistaDialog.Show(hWndOwner, InitialDirectory, Title)
                : ShowXpDialog(hWndOwner, InitialDirectory, Title);
            _fileName = result.FileName;
            return result.Result;
        }

        private struct ShowDialogResult {
            public bool Result { get; set; }
            public string FileName { get; set; }
        }

        private static ShowDialogResult ShowXpDialog(IntPtr ownerHandle, string initialDirectory, string title) {
            var folderBrowserDialog = new FolderBrowserDialog {
                Description = title,
                SelectedPath = initialDirectory,
                ShowNewFolderButton = false
            };
            var dialogResult = new ShowDialogResult();
            if (folderBrowserDialog.ShowDialog(new WindowWrapper(ownerHandle)) == DialogResult.OK) {
                dialogResult.Result = true;
                dialogResult.FileName = folderBrowserDialog.SelectedPath;
            }
            return dialogResult;
        }

        private static class VistaDialog {
            private const string c_foldersFilter = "Folders|\n";

            private const BindingFlags c_flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            private readonly static Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
            private readonly static Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
            private readonly static MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
            private readonly static MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
            private readonly static MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
            private readonly static MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
            private readonly static uint s_fosPickFoldersBitFlag = (uint) s_windowsFormsAssembly
                .GetType("System.Windows.Forms.FileDialogNative+FOS")
                .GetField("FOS_PICKFOLDERS")
                .GetValue(null);
            private readonly static ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
                .GetType("System.Windows.Forms.FileDialog+VistaDialogEvents")
                .GetConstructor(c_flags, null, new[] { typeof(FileDialog) }, null);
            private readonly static MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
            private readonly static MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
            private readonly static MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");

            public static ShowDialogResult Show(IntPtr ownerHandle, string initialDirectory, string title) {
                var openFileDialog = new OpenFileDialog {
                    AddExtension = false,
                    CheckFileExists = false,
                    DereferenceLinks = true,
                    Filter = c_foldersFilter,
                    InitialDirectory = initialDirectory,
                    Multiselect = false,
                    Title = title
                };

                var iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
                s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
                s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint) s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
                var adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
                s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);

                try {
                    int retVal = (int) s_showMethodInfo.Invoke(iFileDialog, new object[] { ownerHandle });
                    return new ShowDialogResult {
                        Result = retVal == 0,
                        FileName = openFileDialog.FileName
                    };
                }
                finally {
                    s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
                }
            }
        }

        // Wrap an IWin32Window around an IntPtr
        private class WindowWrapper : IWin32Window {
            private readonly IntPtr _handle;
            public WindowWrapper(IntPtr handle) { _handle = handle; }
            public IntPtr Handle { get { return _handle; } }
        }
    }
}

Windows窗体中的用法如下:

var dialog = new FolderSelectDialog {
    InitialDirectory = musicFolderTextBox.Text,
    Title = "Select a folder to import music from"
};
if (dialog.Show(Handle)) {
    musicFolderTextBox.Text = dialog.FileName;
}

您当然可以尝试使用它的选项以及它公开的属性。例如,它允许在Vista样式对话框中进行多选。

第二解决方案

西蒙·穆里尔(Simon Mourier)给出了一个答案该答案显示了如何直接使用针对Windows API的互操作来完成完全相同的工作,但是如果在较旧的Windows版本中,则必须对他的版本进行补充才能使用较旧的样式对话框。不幸的是,当我制定解决方案时,我还没有找到他的职位。命名你的毒药!


以类似的用法示例将此精美对话框称为带有空句柄的对话框(例如,从控制台类型的应用程序):直接在框内进行编译:var dialog = new FolderSelectDialog {InitialDirectory =“ C:\\”,Title =“选择一个从“}导入音乐的文件夹;如果(dialog.Show()){字符串myFolder = dialog.FileName; }
Philm,2013年

注:我使用的例子作为一个评论是难以阅读,因此:原来的用法“榜样”最重要的变化:使用InitialDirectory和标题之间用逗号..
Philm

1

尝试从Codeproject贷给 Nitron)进行以下操作:

我认为这与您正在谈论的对话框相同-也许您添加屏幕截图会有所帮助?

bool GetFolder(std::string& folderpath, const char* szCaption=NULL, HWND hOwner=NULL)
{
    bool retVal = false;

    // The BROWSEINFO struct tells the shell how it should display the dialog.
    BROWSEINFO bi;
    memset(&bi, 0, sizeof(bi));

    bi.ulFlags   = BIF_USENEWUI;
    bi.hwndOwner = hOwner;
    bi.lpszTitle = szCaption;

    // must call this if using BIF_USENEWUI
    ::OleInitialize(NULL);

    // Show the dialog and get the itemIDList for the selected folder.
    LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

    if(pIDL != NULL)
    {
        // Create a buffer to store the path, then get the path.
        char buffer[_MAX_PATH] = {'\0'};
        if(::SHGetPathFromIDList(pIDL, buffer) != 0)
        {
            // Set the string value.
            folderpath = buffer;
            retVal = true;
        }       

        // free the item id list
        CoTaskMemFree(pIDL);
    }

    ::OleUninitialize();

    return retVal;
}

images.google.com/…不确定时进行研究。我描述了我想要的东西,而FolderBrowserDialog已不符合回答的资格。
OwenP '02

“我知道FolderBrowserDialog,但我从未真正喜欢过该对话框。它开始时太小,不能让我利用能够键入路径的优势。” 自己研究一下-您可以在其中输入路径。无论如何,我认为这是一个模棱两可的问题,祝你好运。
demoncodemonkey

@demoncodemonkey:您不能键入路径的一部分,然后导航到所需的目标。到目前为止,还不如FileOpenDialog提供的选项方便。
Treb

1

在Vista上,您可以将IFileDialog与FOS_PICKFOLDERS选项一起使用。这将导致显示类似OpenFileDialog的窗口,您可以在其中选择文件夹:

var frm = (IFileDialog)(new FileOpenDialogRCW());
uint options;
frm.GetOptions(out options);
options |= FOS_PICKFOLDERS;
frm.SetOptions(options);

if (frm.Show(owner.Handle) == S_OK) {
    IShellItem shellItem;
    frm.GetResult(out shellItem);
    IntPtr pszString;
    shellItem.GetDisplayName(SIGDN_FILESYSPATH, out pszString);
    this.Folder = Marshal.PtrToStringAuto(pszString);
}

对于较旧的Windows,您始终可以选择在文件夹中选择任何文件来欺骗。

在.NET Framework 2.0及更高版本上可用的工作示例可以在这里找到。


1

您可以使用这样的代码

过滤器为空字符串。文件名是AnyName,但不能为空

        openFileDialog.FileName = "AnyFile";
        openFileDialog.Filter = string.Empty;
        openFileDialog.CheckFileExists = false;
        openFileDialog.CheckPathExists = false;

6
我知道这是一篇过时的文章,但是对于任何想尝试一下的人来说,除非您要打开的目录绝对没有子目录,否则它实际上是行不通的。因此,如果我想让我的用户浏览到一个文件夹并选择它,并在某些文本框中填充文件夹路径,则如果目录C:\ SomeParentDir \ SomeChildDir存在,则用户永远不会选择C:\ SomeParentDir,因为选择“打开” ”只是将您带到子目录。
吉姆

很好的尝试..但这导致UI糟糕,因为文本框中的“ AnyFile”只是在等待用户覆盖其文本。.除此之外,用户还可以选择文件-不够好。但是不错的尝试..
2014年


-1

我知道问题在于配置,OpenFileDialog但看到Google将我带到这里,我也要指出,如果您只在寻找文件夹,则应该使用FolderBrowserDialog代替”作为下面另一个SO问题的答案

如何在vb.net中使用打开文件对话框指定路径?


误导。1)这不是唯一的选择;2)在大多数情况下,这不是一个好选择;仍然它需要最少的代码,而最终用户花费的时间却更多。
猫猫2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.