He podido apreciar en tu codigo que tu hiciste que los elementos o nodos del Treeview se cargan recien cuando el programa corre. Y yo los nodos los puse de antemano.
Los nodos los creé en tiempo de ejecución basicamente por que de otra forma habría sido imposible mostrarte un ejemplo práctico de como hacerlo (de como inicializar cada nodo y con qué tipo de valores). Si yo hubiese añadido los nodos en tiempo de diseño, ¿qué código te habría enseñado en vez del que te mostré?:
// Los nodos hijos de controles.
static TreeNode[] childControlNodes = {
new TreeNode
("Label") { Tag
= typeof(Label
) },
new TreeNode
("ListBox") { Tag
= typeof(ListBox
) },
new TreeNode
("ListView") { Tag
= typeof(ListView
) },
new TreeNode
("TextBox") { Tag
= typeof(TextBox
) } };
...No habría podido desarrollar y mostrar un código funcional si no hubiese añadido los elementos en tiempo de ejecución para construir el contenido del TreeView.
SI hubiese añadido los nodos en tiempo de diseño a través del editor de nodos del TreeView, entonces tendría que haberte mostrado el código auto-generado por Visual Studio en el archivo
Form1.Designer.cs ...lo cual podría haber generado confusión y desde luego no habría sido un ejemplo tan practico para mostrar:
private void InitializeComponent()
{
// ...
//
//TreeView1
//
this.TreeView1.Location = new System.Drawing.Point(130,
104); this.TreeView1.Name = "TreeView1";
TreeNode1.Name = "NodeListBox";
TreeNode1
.Tag = typeof(ListBox
); TreeNode1.Text = "ListBox";
TreeNode2.Name = "NodeTextBox";
TreeNode2
.Tag = typeof(TextBox
); TreeNode2.Text = "TextBox";
TreeNode3.Name = "NodeLabel";
TreeNode3
.Tag = typeof(Label
); TreeNode3.Text = "Label";
this.TreeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { TreeNode1
}); this.TreeView1.Size = new System.Drawing.Size(121,
97); this.TreeView1.TabIndex = 0;
//
//Form1
//
// ...
}
Aparte, el editor en tiempo de diseño de nodos del TreeView solo acepta un valor de tipo
String en la propiedad
Tag (->
TreeNode1.Tag = "ListBox"; ), por lo que deberías hacer modificaciones manuales en el código auto-generado de Visual Studio como yo he echo aquí arriba (->
TreeNode1.Tag == typeof(ListBox); ) para adaptarlo a tus necesidades... lo cual sería una necesidad un poco "engorrosa".
Es normal que los programadores hacen como tu o fue solo una decision personal?
En general lo común sería añadir los elementos de cualquier colección de items de un control (en este caso los nodos de un TreeView) en tiempo de diseño, de esta forma podemos representar el contenido de dicho control al instante, en tiempo de diseño (valga la redundancia), sin la necesidad de compilar el proyecto.
Pero si la intención es mostrar un ejemplo didáctico de como crear/añadir elementos, entonces logicamente la mejor decisión es añadir los elementos en tiempo de ejecución para mostrar como se deben añadir. Si la intención es crear elementos de forma dinámica, o a través de un DataSource.
Si lo prefieres puedes añadir los nodos en el editor de nodos en tiempo de diseño, de la siguiente manera:
Y luego desarrollar una simple función para resolver el typename en tiempo de ejecución de forma dinámica:
Type t = TypeNameResolver(treeView1.Nodes("NodeListBox").Tag); // Type = System.Windows.Forms.ListBox
private Type TypeNameResolver(string winFormsControlName) {
string fullName = typeof(Form).AssemblyQualifiedName;
fullName = fullName.Substring(fullName.IndexOf(","));
fullName = string.Format("System.Windows.Forms.{0}{1}", winFormsControlName, fullName);
return Type.GetType(fullName, throwOnError: true, ignoreCase: true);
}
Así sería como yo lo haria, pero eso son cosas que logicamente seria irrelevante mostrarlas en un ejemplo práctico como el que te mostré en mi otra respuesta.
Saludos!