Ниже приведен скриншот пользовательского интерфейса и некоторых фрагментов кода (в основном обработчиков событий), связанных с реализацией диалогового окна выбора файла И папки, о котором я упоминал в своем комментарии.
Хотя весь код, относящийся к навигации по каталогам и фактическому извлечению путей к файлам, находится на другом уровне кода (оболочка вокруг API управления версиями), это должно дать вам представление о том, как можно реализовать диалог выбора файла И папки с включенным выбором нескольких элементов с точки зрения управления. Простая кнопка, чтобы сжать текущий выбор, может вызвать GetSourceSelectedFilePaths
(или как вы можете назвать его), а затем сжать все эти пути вместе.
Я подозреваю, что класс System.IO.Directory
содержит почти все методы, которые вам понадобятся для обработки части навигации по файлам / каталогам.
Это, конечно, не очень эстетично, и я знаю, что вы не заинтересованы в том, чтобы реализовать это самостоятельно, но это, безусловно, возможно (и относительно легко, если вы можете жить с чем-то, что выглядит так). Если бы у меня было больше времени, я бы заменил все эти вызовы обертки API на вызовы методов System.IO.Directory
, чтобы сделать это немного яснее.
// 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;
}