TreeView, где корневой и все последующие узлы извлекаются из первой подпапки - как указать правильный путь? - PullRequest
0 голосов
/ 11 февраля 2012

Я работаю над простым переносимым приложением для одной формы, в котором * .exe и папка UserGeneratedContent находятся в одном каталоге.В моей форме есть древовидное представление, которое я хочу заполнить узлами, соответствующими всем подпапкам (если они существуют) UserGeneratedContent.Код, который я вставил ниже, работает почти так, как я хочу, но он заполняет древовидную структуру UserGeneratedContent в качестве корневого узла и, в свою очередь, обрабатывает найденные подпапки как дочерние узлы и т. Д.

string folder = @"UserGeneratedContent";
FolderHierachy.Nodes.Add(GetDirectoryNodes(folder));

private static TreeNode GetDirectoryNodes(string path)
{
    var node = new TreeNode(Path.GetFileName(path));
    var subDirs = Directory.GetDirectories(path).Select(d => GetDirectoryNodes(d)).ToArray();

     node.Nodes.AddRange(subDirs);
     return node;
}

На этом этапе я попробовал практически каждую комбинацию @ "UserGeneratedContent", о которой я могу подумать - добавив обратную косую черту и т. Д., Пытаясь получить доступ к подпапкам, но мне не повезло.Я знаю, что это, вероятно, что-то простое, но я застрял - какой правильный синтаксис гарантирует, что вышеописанный метод проверяет UserGeneratedContent для получения подпапок?

Кроме того, я хочу, чтобы элемент управления treeview позволялпользователь может создавать, переименовывать и удалять папки в любой иерархии по своему выбору, поэтому мне интересно, что будет считаться наилучшей практикой в ​​этом отношении?

Редактировать \ Обновить # 1 - 12.2.2012:

После гораздо большего количества проб и ошибок я отказался от приведенного выше кода - независимо от того, что я пытался, я не мог заставить его работать по какой-то причине.К счастью, приведенный ниже код отлично работает для меня: -)

DirectoryInfo dirInfo = new DirectoryInfo(@"UserGeneratedContent");
DirectoryInfo[] subDirs = dirInfo.GetDirectories();

string pathToSubFolders = Path.Combine(@"UserGeneratedContent", subDirs[0].ToString());

PopulateTreeView(treeView1, pathToSubFolders);

private void PopulateTreeView(TreeView treeView, string path)
{
     treeView.Nodes.Clear();
     var rootDirectoryInfo = new DirectoryInfo(path);
     treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
     var directoryNode = new TreeNode(directoryInfo.Name);           
     foreach(var directory in directoryInfo.GetDirectories())
     {
          directoryNode.Nodes.Add(CreateDirectoryNode(directory));
     }

     return directory;
}

Мне нужно добавить в него код обработки ошибок, чтобы не было подпапок в @ "UserGeneratedContent" - как есть subDirs[0].ToString() выдает исключение IndexOutOfRangeException, если нет подпапок, и я не совсем уверен, как это сделать, поэтому я был бы благодарен за некоторые указатели.

Редактирование \ Обновление № 2 - 12.2.2012:

Для проверки ошибок я использовал блок try-catch, как показано ниже:

try
{

  string pathToSubFolders = Path.Combine(dirInfo.ToString(), subDirs[0].ToString());

  PopulateTreeView(treeView1, pathToSubFolders);

}
catch (IndexOutOfRangeException)
{

            //Do Something Here

}

Приведенный выше код работает, но кто-нибудь может сказать мне, правильно ли я поступил?

Спасибо за чтение.

1 Ответ

2 голосов
/ 18 апреля 2012

, если вы еще не нашли другого решения, простой способ будет:

if(subDirs.Lenght != 0)        // or > 0
{
  string pathToSubFolders = Path.Combine(dirInfo.ToString(), subDirs[0].ToString());
  PopulateTreeView(treeView1, pathToSubFolders);
}
else
{
  //Do Something Here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...