Member 13765884 Ответов: 2

Узлы Treeview, показанные в списке


При нажатии кнопки (MoveBtn )как скопировать элементы, выбранные в моем древовидном представлении, в список?


private void MoveBtn_Click(object sender, EventArgs e)
{

    Listbox1.Items.Clear();
    foreach (var node in treeView1.Nodes)
    {
        Listbox1.Items.Add(node);
    }
    Listbox1.Show();

}

Этот код показывает только корневые, но не дочерние узлы, которые выбраны. Но я хочу показать и дочерние узлы-если это возможно, то только дочерние узлы

Что я уже пробовал:

Listbox1.Items.Clear();
foreach (var node in treeView1.Nodes)
{
    Listbox1.Items.Add(node);
}
Listbox1.Show();

BillWoodruff

Стандартный WinForm TreeView не поддерживает множественный выбор: используете ли вы сторонний TreeView, который это делает ? Я сомневаюсь в этом, но я думаю, что задать вопрос здесь важно, просто на всякий случай.

codeprojectddx

когда вы используете treeView1.Nodes ,вы получаете эти корневые заметки .На самом деле Примечания второго уровня и ниже не находятся в treeView1.Nodes.

2 Ответов

Рейтинг:
1

BillWoodruff

Примечание: веб-МС TreeView элемент предлагает легкий доступ ко всем проверено TreeNodes: в приложения WinForms TreeView элемент TreeView элемент не.

Итак, вам нужен метод, чтобы получить все Триноды, а потом вам нужно будет выбирать все проверенные древовидные узлы. В этом примере используется "классический" стековый метод, который защищает Эрик Липперт, чтобы избежать возможного переполнения стека рекурсией:

public IEnumerable<TreeNode> GetNodes(TreeNodeCollection nodes)
{
    var stack = new Stack<TreeNode>();

    foreach (TreeNode node in nodes)
    {
       stack.Push(node);
    }

    while (stack.Count > 0)
    {
        var current = stack.Pop();
        yield return current;

        foreach (TreeNode child in current.Nodes)
        {
            stack.Push(child);
        }
    }
}
Затем отфильтруйте их, чтобы найти проверенные узлы:
listBox1.Items.Clear();

var checkedNodes = GetNodes(treeView1.Nodes)
    .Where(nd => nd.Checked)
    .OrderBy(nd => nd.Text)  // remove if you don't want sorted 
    .ToArray();

listBox1.Items.AddRange(checkedNodes.ToArray());


Member 13765884

Спасибо, но этот код помещает только выбранные элементы (выделенный узел) в список, а не помещает все отмеченные элементы в список.
Знаете ли вы, как исправить это для проверенных предметов? - я не могу этого понять

BillWoodruff

Теперь, наконец, мы знаем, что вы используете флажки. См. пересмотренное решение.

Рейтинг:
0

Wendelius

Чтобы скопировать все узлы, вам нужна рекурсия. Рассмотрим следующий пример (извините за опечатки, у меня сейчас нет компилятора под рукой)

public void Method1() {
   Listbox1.Items.Clear();
   AddNodes(treeView1.SelectedNode, Listbox1);
}

public void AddNodes(TreeNode parentNode, ListBox lb) {
   foreach (var node in parentNode.Nodes) {
      lb.Items.Add(node);
      AddNodes(node, lb);
   }
}


Member 13765884

извините, я действительно не понимаю вашего ответа.


частная MoveBtn_Click недействительным(объект отправителя, EventArgs в электронной)
{
Список listbox1.Предметы.Четкий();
AddNodes(treeView1.SelectedNode, Listbox1);
Список listbox1.Показать();
}

общественного недействительными AddNodes(parentNode узлов дерева, списка фунт)
{
foreach (var узел в parentNode.Узлы)
{
фунт.Предметы.Добавить(узел);
AddNodes(parentNode, lb);
}
}
Я попробовал это сделать и получаю ошибку


Необработанное исключение типа "System.NullReferenceException" произошло в мониторинге и запасе management.exe

Дополнительная информация: ссылка на объект не установлена на экземпляр объекта.

Wendelius

На какой линии вы получаете это исключение?

Member 13765884

foreach (var узел в parentNode.Узлы)

это та строка, в которой я получаю ошибку

Wendelius

Вероятно, при нажатии кнопки MoveBtn у вас нет выбранного узла. Попробовать следующее

private void MoveBtn_Click(object sender, EventArgs e) {
   Listbox1.Items.Clear();
   if (treeView1.SelectedNode != null) {
      AddNodes(treeView1.SelectedNode, Listbox1);
   }
   Listbox1.Show();
}