チェックボックスが有効になっているフォームにツリーリストがあります。チェックしたものをリストに追加して、そのリストを書き出せるようにする必要があります。親ノード(または最上位ノード)をチェックすると、それらが含まれます。親ノードを選択すると、その子ノードも選択され (これは意図的なものです)、それらが表示されます。しかし、子ノードのみをチェックすると、リストに追加されません。
//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 つの親ノードを選択すると、発生する再帰 (正しい用語だと思います) により、最初にチェックされたノードが検出され、最初からやり直され、同じチェックされたノードが 2 番目のノードに到達する前にもう一度追加されます。ノードのセット。
親ノードが選択されていない状態で選択された子ノードが検出されない理由を特定するには、ノード テストを提供しました。
更新 - 2013 年 3 月 18 日私のボタン クリック コード:
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();
}