Почему мои дочерние узлы не обнаруживаются без выбора родительского узла?
В моей форме есть деревянный список с включенными флажками. Мне нужно добавить что-нибудь отмеченное в список, чтобы я мог написать этот список. Если я проверяю какие-либо родительские узлы (или узлы самого высокого уровня), он включает их. Если я выбираю какие-либо родительские узлы, он также выбирает свои дочерние узлы (это сделано намеренно) и отображает их. Но если я проверю только какие-либо дочерние узлы, он не добавит их в мой список.
//check to see if there are any nodes checked
bool nodeHasCheck = false;
foreach (TreeNode n in nodes)
{
if (n.Checked)
{
nodeHasCheck = true;
break;
}
GetExtendedFeatures(n.Nodes);
}
//only return stuff if something's checked
if (nodeHasCheck == true)
{
foreach (TreeNode n in nodes)
{
if (n.Checked)
{
//n.BackColor = Color.Black;
nodeList.Add(n.Text);
}
GetExtendedFeatures(n.Nodes);
}
Также кажется, что если я выберу 2 родительских узла, рекурсия, которая происходит (думаю, что это правильный термин) заставляет его найти первый проверенный узел, затем запускается заново и добавляет этот же проверенный узел второй раз, прежде чем он достигнет второго набор узлов.
Я предоставил свой тест узла, надеюсь, этого достаточно, чтобы определить, почему он не обнаруживает дочерние узлы, выбранные без выбранного родительского узла.
ОБНОВЛЕНО - 18.03.13 Мой код нажатия кнопки:
private void btnGenerate_Click(object sender, EventArgs e)
{
ScanNodes(treeView1.Nodes[0]);
}
private void ScanNodes(TreeNode parent)
{
foreach (TreeNode node in parent.Nodes)
{
if (node.Checked)
{
nodeList.Add(node.Text.ToString());
}
if (node.Nodes.Count > 0)
{
ScanNodes(node);
}
}
var message = string.Join(Environment.NewLine, nodeList);
message = message.Replace(Environment.NewLine, ", ");
MessageBox.Show(message);
nodeList.Clear();
}
1 ответ
Чтобы получить список всех выбранных узлов в TreeView, вы можете использовать следующее:
Supose список назван nodeList
:
//We First declare a recursive method to loop through all nodes,
//we need to pass a root node to start
private void ScanNodes(TreeNode parent)
{
foreach (TreeNode node in parent.Nodes)
{
if (node.Checked)
{
nodeList.Add(node.Text);
}
if (node.Nodes.Count > 0)
{
ScanNodes(node);
}
}
}
С этой настройкой вам просто нужно вызвать метод ScanNodes и передать корневой узел вашего TreeView:
ScanNodes(treeView1.Nodes[0]);
С Уважением,