#c# #.net #treeview
#c# #.net #просмотр дерева
Вопрос:
У меня есть TreeView с флажком в моем приложении на основе C # Windows form.Пользователь выбирает элемент, нажимая флажки в узлах. Теперь я хочу получать имя узла выбранных флажков при каждом нажатии кнопки getselectedlist, нажатой пользователем. как мне это сделать?.
Пожалуйста, помогите мне решить эту проблему…
Ответ №1:
Вы можете просто использовать простую рекурсивную функцию:
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 aResu<
}
Просто используйте его на YourTreeView.Nodes
Комментарии:
1. Но
aResult.AddRange( CheckedNames( aNode.Nodes ) );
— это дочерняя итерация
Ответ №2:
Или вместо рекурсивного перебора каждого узла в 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());
}
}
}
Ответ №3:
При событии нажатия кнопки вы можете выполнить итерацию по всему дереву, как описано вhttp://msdn.microsoft.com/en-us/library/wwc698z7.aspx. Затем для каждого TreeNode вы можете проверить, установлен флажок или нет, и если он установлен, вы можете добавить его имя в список.
Ответ №4:
//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;
}