我在基于C#Windows窗体的应用程序中有一个带CheckBox的TreeView。用户通过单击节点中的复选框来选择一个项目。现在我想在用户按下getselectedlist按钮时获取所选的复选框节点名称。我这样做了吗?
请指导我摆脱这个问题...
答案 0 :(得分:21)
您可以使用简单的递归函数:
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;
}
只需在YourTreeView.Nodes
答案 1 :(得分:11)
或者,每次检查某些内容时,不会递归遍历TreeView中的每个节点,这可能会变得昂贵,就像我一样,您在列表中有数百或数千个项目,但检查的项目不超过20个。
我在check / uncheck之后添加/删除字符串列表,因为我只需要FullPath字符串,但如果需要,你也可以以相同的方式使用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());
}
}
}
答案 2 :(得分:1)
在按钮点击事件中,您可以按照http://msdn.microsoft.com/en-us/library/wwc698z7.aspx中的说明遍历整个树。然后,对于每个TreeNode,您可以检查是否选中了复选框,如果选中它,则可以将其名称添加到列表中。
答案 3 :(得分:1)
//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;
}