La vista de árbol del programa C# Winform utiliza un método recursivo para vincular datos y construir un modelo de nodo de tres niveles. ¿Cómo guardar el valor del nodo seleccionado al agregarlo?
¿Quieres decir que cuando "agregas" un nombre de grupo, es decir, se puede mantener el estado seleccionado actual cuando cambia la estructura del árbol? (Por supuesto, no es necesario seleccionar los nodos secundarios en el grupo recién agregado)
Si se refiere a este problema, entonces el problema se reduce a: cómo guardar y restaurar condicionalmente el estado seleccionado de el nodo del árbol.
Sabemos que cada nodo del árbol tiene una ruta (atributo FullPath), y la ruta puede indicar la estructura completa del árbol. El formato predeterminado de la ruta es Texto de nodo\Texto de nodo\..., si no modifica el separador de ruta.
Bien, entonces escribamos una pequeña clase auxiliar para ayudar a guardar y restaurar el estado seleccionado de los nodos del árbol. public?class?TreeStatusLoader
{
TreeView?tv;
Diccionario
público?TreeStatusLoader(TreeView?tv)
{
this.tv?=?tv;
}
public?void?SaveTreeStatus()
{
treeStatusDic.Clear();
SaveTreeStatus(tv.Nodes);
}
privado?void?SaveTreeStatus(TreeNodeCollection?nodos)
{
foreach?(TreeNode?tn?en?nodos )
{
if?(!treeStatusDic.ContainsKey(tn.FullPath))
treeStatusDic.Add(tn.FullPath,?tn.Checked);
SaveTreeStatus(tn.Nodes);
}
}
público?void?LoadTreeStatus()
{
LoadTreeStatus(tv.Nodes);
}
privado?void?LoadTreeStatus(TreeNodeCollection?nodes)
{
foreach?(TreeNode?tn?in?nodes)
{
if?(treeStatusDic.ContainsKey(tn.FullPath))
tn.Checked?=?treeStatusDic[tn.FullPath];
LoadTreeStatus(tn.Nodes);
}
}
}
Esta clase en realidad atraviesa todos los nodos, guardando sus propiedades FullPath y Checked para su restauración. Usé un poco de recursividad.
Finalmente, quiero señalar que FullPath usa el valor de Texto del nodo, que uso como clave del diccionario si tienes la mala suerte de tener un nodo con el mismo Texto en un punto determinado. nivel del árbol, proporcione una clave única adecuada (como reemplazar cada texto en FullPath con Nombre o proporcionar una etiqueta única como identificador para el nodo).
Es muy sencillo de utilizar,
TreeStatusLoader tsl=new TreeStatusLoader(treeview1);
tsl.SaveTreeStatus();
tsl.LoadTreeStatus ();