2015-03-04 4 views
0

Я занимаюсь узлами, дочерними узлами, дочерними дочерними узлами в списке TreeView; не говоря уже о флажках. Моя цель - выбрать/проверить несколько узлов, и каждый узел, связанный с эксклюзивным кодом, будет выполняться одним щелчком кнопки. Я подумал об использовании инструкции foreach с помощью оператора switch и if. Предварител, чтобы пройти через узлы дерева, , если, чтобы проверить, проверен ли узел, и коммутатор для просмотра значений, соответствующих проверяемому узлу. Это моя идея, но я чувствую, что для нее лучше. Может ли кто-нибудь проверить программу ниже или предоставить более легкую, более чистую версию?Использование инструкции foreach и переключатель для проверенных нескольких узлов

Моя идея: сделать это следующим образом:

foreach (TreeNode rootNodes in treeView1.Nodes) 
{ 
    foreach (TreeNode childNodes in rootNodes.Nodes) 
    { 
     if (childNodes.Checked == true) 
     { 
      switch (childNodes.Name.ToString()) 
      { 
       case "Trial A": 
        //execute code for Trial A 
        MessageBox.Show("A"); //trial 
        break; 
       case "Trial B": 
        //execute code for Trial B 
        MessageBox.Show("B"); //trial 
        break; 
       case "Trial C": 
        //execute code for Trial C 
        MessageBox.Show("C"); //trial 
        break; 
       default: 
        MessageBox.Show("error"); 
        break; 
      } 
     } 
    } 
} 

До сих пор, когда я попытался это, он работал. Когда я выбрал несколько узлов, каждый код узла работал по одному. На самом деле я очень обрадовался. Проблема кроется во мне, есть это ворчащее чувство, что эта программа может быть потенциально неправильной или я могу столкнуться с проблемами в будущем.

Я использую VS 2005, .NET 2.0, работающий на WinForms. Sidenote: Я проанализировал XML-файл в список древовидной структуры. Узлы соответствуют объектам в XML-файле.

Еще одно сообщение: Я все еще учусь. Я новичок. Определенно, новичок C#. Что касается других опытов программирования, я знаю немного C и C++ (но только основы, только для некоторых упражнений и проектов в школе).

+3

этот код даже работает? я не уверен, что он компилируется?! 'foreach (childNodes.Checked in rootNodes)' !! – chouaib

+2

Две вещи, которые, вероятно, придираются к кости вашего программиста: a) что вы не можете быть уверены в глубине, на которую может расти дерево, и б), что структура корпуса не дает возможности добавить реальный код. Для a) вам нужна рекурсия, как в ответе Нила, для b) вы можете использовать делегатов и, возможно, создать словарь .. – TaW

+0

@chouaib, я его отредактировал сейчас. Я не понимал, что здесь я вставил другой код (очевидно, неверный), я экспериментировал. Теперь я изменил его на рабочий. Я думаю. – Kurisuchin

ответ

2

Если я правильно понимаю, что вы можете иметь неопределенную иерархическую глубину узлов. В этом случае вам необходимо выполнить рекурсию:

foreach (TreeNode node in treeView1.Nodes) RecurseTree(node); 

private void RecurseTree(TreeNode node) 
{ 
    if (node.Checked == true) 
    { 
     switch (node.Name) 
     { 
      case "Trial A": 
       //execute code for Trial A 
       MessageBox.Show("A"); //trial 
       break; 
      case "Trial B": 
       //execute code for Trial B 
       MessageBox.Show("B"); //trial 
       break; 
      case "Trial C": 
       //execute code for Trial C 
       MessageBox.Show("C"); //trial 
       break; 
      default: 
       MessageBox.Show("error"); 
       break; 
     } 
    } 

    foreach (TreeNode childNode in node.Nodes) RecurseTree(childNode); 
} 
+0

Это правда, у меня есть довольно много узлов под рукой, и это заставляет меня плакать, думая, что я должен набирать (кашлять, копировать и вставлять) все их. Одна вещь, которая меня беспокоит, заключается в том, что это может быть несовместимо с версией, которую я использую, чтобы знать, что var был введен примерно в .NET 3.0 или 3.5? Я не уверен. Не могли бы вы предоставить один совместимый с .NET 2.0? Благодарю. – Kurisuchin

+1

Концепция рекурсии остается той же, вы можете просто заменить «var» на имя класса, которое в вашем случае, безусловно, TreeNode. Я обновлю пример для вас. –

+0

Этот код будет работать только в том случае, если все имена узлов различны. Если есть одинаковые имена (из разных родительских узлов), то функция должна строить путь от имен и использовать пути в 'switch'. – Dialecticus