Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#4.0在TreeView中获取所有选中的复选框节点名称?_C#_.net_Treeview - Fatal编程技术网

如何使用c#4.0在TreeView中获取所有选中的复选框节点名称?

如何使用c#4.0在TreeView中获取所有选中的复选框节点名称?,c#,.net,treeview,C#,.net,Treeview,在基于C#Windows表单的应用程序中,我有一个带有复选框的树状视图。用户通过单击节点中的复选框来选择项目。现在,每当用户单击getselectedlist按钮时,我都希望获得选中的复选框节点名称。我是如何做到的 请引导我摆脱这个问题…在按钮单击事件中,您可以重复整个树,如中所述。然后,对于每个树节点,您可以检查复选框是否选中,如果选中,您可以将其名称添加到列表中。您可以使用简单的递归函数: List<String> CheckedNames( System.Windows.For

在基于C#Windows表单的应用程序中,我有一个带有复选框的树状视图。用户通过单击节点中的复选框来选择项目。现在,每当用户单击getselectedlist按钮时,我都希望获得选中的复选框节点名称。我是如何做到的


请引导我摆脱这个问题…

在按钮单击事件中,您可以重复整个树,如中所述。然后,对于每个树节点,您可以检查复选框是否选中,如果选中,您可以将其名称添加到列表中。

您可以使用简单的递归函数:

List<String> CheckedNames( System.Windows.Forms.TreeNodeCollection theNodes)
{
    List<String> aResult = new List<String>();

    if ( theNodes != null )
    {
        foreach ( System.Windows.Forms.TreeNode aNode in theNodes )
        {
            if ( aNode.Checked )
            {
                aResult.Add( aNode.Text );
            }

            aResult.AddRange( CheckedNames( aNode.Nodes ) );
        }
    }

    return aResult;
}
列出选中的名称(System.Windows.Forms.TreeNodeCollection节点)
{
List aResult=新列表();
if(theNodes!=null)
{
foreach(节点中的System.Windows.Forms.TreeNode阳极)
{
如果(阳极检查)
{
aResult.Add(阳极.文本);
}
aResult.AddRange(选中的名称(阳极节点));
}
}
返回结果;
}

只需在您的TreeView.Nodes上使用它,而不是在每次检查某个项目时递归地遍历TreeView中的每个节点,这可能会变得很昂贵,就像我一样,您的列表中有数百或数千个项目,但检查的项目不超过20个

我在选中/取消选中后从字符串列表中添加/删除,因为我只需要完整路径字符串,但是如果需要的话,您也可以用同样的方式使用TreeNode集合

public partial class Form1 : Form
{
    List<String> CheckedNodes = new List<String>();

    public Form1()
    {
        InitializeComponent();
    }

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        if (e.Node.Checked)
        {
            CheckedNodes.Add(e.Node.FullPath.ToString());
        }
        else
        {
            CheckedNodes.Remove(e.Node.FullPath.ToString());
        }
    }
}
公共部分类表单1:表单
{
List CheckedNodes=新列表();
公共表格1()
{
初始化组件();
}
私有无效树视图1_检查后(对象发送方,树视图目标e)
{
如果(e.节点已选中)
{
添加(例如Node.FullPath.ToString());
}
其他的
{
CheckedNodes.Remove(例如Node.FullPath.ToString());
}
}
}
//简单可靠的方法
列表_valueList=新列表();
私有列表getCheckedNodes(TreeNodeCollection\u parentNodeList)
{
foreach(父节点列表中的树节点项)
{
如果(选中项)
{
_valueList.Add(转换为32(item.Value));
}
如果(item.ChildNodes.Count>0)
{
//NET不会忘记它在哪里停留过。
getCheckedNodes(item.ChildNodes);
}
} 
返回(u)价值清单;;
}
但是
aResult.AddRange(选中的名称(阳极节点))-是一个子迭代
    //Uncomplicated, reliable method
    List<int> _valueList = new List<int>();
    private List<int> getCheckedNodes(TreeNodeCollection _parentNodeList)
    {
        foreach (TreeNode item in _parentNodeList)
        {
            if (item.Checked)
            {
                _valueList.Add(Convert.ToInt32(item.Value));
            }

            if (item.ChildNodes.Count > 0)
            {
                //.NET does not forget where it stayed.
                getCheckedNodes(item.ChildNodes);
            }
        } 

        return _valueList;
    }