我意识到已经有很多问题与此类似:
multi select folders and files
C# Dialog to select multiple files AND folders
C# - How to customize OpenFileDialog to select multiple folders and files?
Required Dialog for selecting Multiple Files and Folders .NET
Select either a file or folder from the same dialog in .NET
但是,没有人提供我想要的东西。 一些解决方案仅适用于选择多个文件,其他解决方案仅适用于多个文件夹。 我所知没有一个允许一次选择两者的混合物。
这似乎正是我想要的...除了它是C ++,而且我不知道如何在.NET中使用它(这是可能的):
https://www.codeproject.com/Articles/28015/SelectDialog-A-Multiple-File-and-Folder-Select-Dia
我意识到,.NET内置的对话框被我忽略的可能性很小。但是,由于我认为这是一个相当普遍的要求,所以我本以为已经有了一些东西,而不是我自己动手做。这将花费相对较长的时间,并且最终可能比内置的OpenFileDialog更基本(所有这些都是我们需要的基本功能)。
我的用例是,我需要一个对话框来选择一些单独的文件和文件夹,以返回它们的路径,以便可以将它们压缩在一起。
对我来说,在Winforms中实现这种对话框最快,最简单的方法是什么?
答案 0 :(得分:1)
下面是UI的屏幕截图和一些代码片段(主要是事件处理程序),这些片段与我在评论中提到的文件AND文件夹选择对话框的实现有关。
尽管与导航目录和实际检索文件路径有关的所有代码都在不同的代码层(版本控制API的包装器)中,但这应该使您了解如何实现文件和文件夹选择对话框从控件角度启用了多项选择。一个用于压缩当前选择内容的简单按钮可以调用GetSourceSelectedFilePaths
(或您可能选择的命名方式),然后将所有这些路径压缩在一起。
我怀疑System.IO.Directory
类包含处理该文件/目录导航方面所需的几乎所有方法。
从美学上讲,这当然不是很多,我知道您并不愿意自己实现它,但是它肯定是有可能的(如果您可以使用类似这样的东西,这相对容易)。如果我有更多时间,我会用System.IO.Directory
方法调用替换所有这些API包装器调用,以使这一点更加清楚。
// Method to display contents at current level (folders and files) to controls
private void AddToDisplayChildFolderContents(APIObject curVaultWrapper, ListBox childFolder_LB, ListBox childFiles_LB)
{
var curDocNames = curVaultWrapper.GetCurFolderDocNames(); // API wrapper call to get all documents in current folder
if (curDocNames.Count > 0)
{
childFiles_LB.Items.Clear();
childFiles_LB.Items.AddRange(curDocNames.ToArray());
}
var childFolderList = = curVaultWrapper.GetCurChildFolderNames(); // API wrapper call to get all folders in current folder
if (childFolderList.Count > 0)
{
childFolder_LB.Items.Clear();
childFolder_LB.Items.AddRange(returnStatus.items.ToArray());
}
}
// Method to navigate up one directory
private void srcGoUp_B_Click(object sender, EventArgs e)
{
if (VaultCopyConfig.SrcVault.DrillOutOfVaultFolder()) // API wrapper method returns true if current folder is root, points version controlled file system API wrapper one directory up
{
this.srcGoUp_B.Enabled = false;
}
DisplayVaultFolderContents(VaultCopyConfig.SrcVault, srcCurrentFolder_TB, srcDrill_IntoSubFolder_CB,
srcChildFolders_LB, srcFiles_LB);
}
// Method to navigate one directory lower
private void srcDrill_IntoSubFolder_CB_SelectedIndexChanged(object sender, EventArgs e)
{
var selectedSubFolderName = srcDrill_IntoSubFolder_CB.Text;
VaultCopyConfig.SrcVault.DrillIntoVaultFolder(selectedSubFolderName, false); // call to our API wrapper
DisplayVaultFolderContents(vaultCopyConfig.srcVault, srcCurrentFolder_TB, srcDrill_IntoSubFolder_CB,
srcChildFolders_LB, srcFiles_LB);
this.srcGoUp_B.Enabled = true;
}
// Method that is called to aggregate all user selections (then sends to our API wrapper to actually validate / process / consolidate paths
private List<string> GetSourceSelectedFilePaths(bool dlgFlag)
{
var filePaths = new List<string>();
var validFolderNames = new List<string>();
var validFileNames = new List<string>();
if (srcChildFolders_LB.Items.Count > 0)
{
string selectedItem;
foreach (int i = 0; i < srcChildFolders_LB.Items.Count; i++)
{
if (srcChildFolders_LB.GetSelected(i))
{
selectedItem = srcChildFolders_LB.Items[i].ToString();
validFolderNames.Add(selectedItem);
}
}
}
if (srcFiles_LB.Items.Count > 0)
{
var selectedItem;
for (int i = 0; i < srcFiles_LB.Items.Count; i++)
{
if (srcFiles_LB.GetSelected(i))
{
selectedItem = srcFiles_LB.Items[i].ToString();
validFileNames.Add(selectedItem);
}
}
}
filePaths = VaultCopyConfig.SrcVault.GetSelectedFilePaths(validFolderNames, validFileNames, dlgFlag); // call to API wrapper to validate / consolidate list of all filepaths in user selection
return filePaths;
}
答案 1 :(得分:1)
即使我没有使用任何提供的代码,我也会接受@ mdsimps99的回答,因为问题是“对我来说,在Winforms中实现这种对话框的最快,最简单的方法是什么?”,他的回答是(不幸的)我必须自己动手。
但是,我认为我会发布不太理想的解决方案以保持完整性。
我没有时间做我想做的事情,也没有提供完全模仿OpenFileDialog的自定义解决方案。因此,我改为在主程序和OpenFileDialog(以及FolderBrowserDialog)之间创建了一个“ SelectPathsDialog”。
这很简单:
“添加文件”按钮将打开OpenFileDialog,并将所选文件添加到列表中。 “添加文件夹”按钮将打开FolderBrowserDialog并将所选文件夹添加到列表中。
它镜像了我已经在OpenFileDialog中使用的所有公共属性。这意味着,在我的主程序中,我能够轻松地将所有对“ OpenFileDialog”的调用替换为“ SelectPathsDialog”,并且它将正常运行。
例如,如果仅需要选择文件,我还添加了属性以启用或禁用适当的按钮。
当我计划在将来进行改进时,我使用了第三方ObjectListView控件,因为它比标准ListView的用途要广泛得多。
正如我所说。这不是理想的。但这暂时可以完成工作,在时间压力不太大的情况下,我随时可以在以后再次进行审查。