locked
Cargar Formularios con TreeView RRS feed

  • Pregunta

  • Estimad@s:

    Me encuentro desarrollando una aplicación donde el formulario principal contiene un TreeView que obtiene sus nodos dinámicamente desde un archivo XML. Mi objetivo es que a través de una propiedad denominada form (que contiene el nombre del formulario asignado) en cada nodo del XML sea capaz de llamar a cada uno de los formularios que se encuentran en el proyecto. A continuación muestro el código para explicarme mejor.

    El XML con la estructura que obtendrá el TreeView:

     

    <?xml version="1.0" encoding="utf-8"?>
    <MenuPrincipal>
     <Modulos>
      <Modulo id ="1" nombre ="Candidatos">
       <Operacion form="C_Candidatos" tipo="Agregar">Registrar Candidato</Operacion>
       <Operacion form="R_Candidatos" tipo="Modificar">Modificar Candidato</Operacion>
       <Operacion form="U_Candidatos" tipo="Eliminar">Eliminar Candidato</Operacion>
       <Operacion form="D_Candidatos" tipo="Consultar">Consultar Candidato</Operacion>
      </Modulo>
      <Modulo id ="2" nombre ="Departamentos">
       <Operacion form="C_Departamentos" tipo="Agregar">Registrar Departamento</Operacion>
       <Operacion form="R_Departamentos" tipo="Modificar">Modificar Departamento</Operacion>
       <Operacion form="U_Departamentos" tipo="Eliminar">Eliminar Departamento</Operacion>
       <Operacion form="D_Departamentos" tipo="Consultar">Consultar Departamento</Operacion>
      </Modulo>
      <Modulo id ="3" nombre ="Entrevistas">
       <Operacion form="C_Entrevistas" tipo="Agregar">Registrar Entrevista</Operacion>
       <Operacion form="R_Entrevistas" tipo="Modificar">Modificar Entrevista</Operacion>
       <Operacion form="U_Entrevistas" tipo="Eliminar">Eliminar Entrevista</Operacion>
       <Operacion form="D_Entrevistas" tipo="Consultar">Consultar Entrevista</Operacion>
      </Modulo>
      <Modulo id ="4" nombre ="Carreras">
       <Operacion form="C_Carreras" tipo="Agregar">Registrar Carrera</Operacion>
       <Operacion form="R_Carreras" tipo="Modificar">Modificar Carrera</Operacion>
       <Operacion form="U_Carreras" tipo="Eliminar">Eliminar Carrera</Operacion>
       <Operacion form="D_Carreras" tipo="Consultar">Consultar Carrera</Operacion>
      </Modulo>
      <Modulo id ="5" nombre ="Facultades">
       <Operacion form="C_Facultades" tipo="Agregar">Registrar Facultad</Operacion>
       <Operacion form="R_Facultades" tipo="Modificar">Modificar Facultad</Operacion>
       <Operacion form="U_Facultades" tipo="Eliminar">Eliminar Facultad</Operacion>
       <Operacion form="D_Facultades" tipo="Consultar">Consultar Facultad</Operacion>
      </Modulo>
      <Modulo id ="6" nombre ="Tipo de Educación">
       <Operacion form="C_TEducacion" tipo="Agregar">Registrar Tipo de Educación</Operacion>
       <Operacion form="R_TEducacion" tipo="Consultar">Consultar Tipo de Educación</Operacion>
       <Operacion form="U_TEducacion" tipo="Modificar">Modificar Tipo de Educación</Operacion>
       <Operacion form="D_TEducacion" tipo="Eliminar">Eliminar Tipo de Educación</Operacion>   
      </Modulo>
      <Modulo id ="7" nombre ="Tipo de Experiencia">
       <Operacion form="C_TExperiencia" tipo="Agregar">Registrar Tipo de Experiencia</Operacion>
       <Operacion form="R_TExperiencia" tipo="Modificar">Modificar Tipo de Experiencia</Operacion>
       <Operacion form="U_TExperiencia" tipo="Eliminar">Eliminar Tipo de Experiencia</Operacion>
       <Operacion form="D_TExperiencia" tipo="Consultar">Consultar Tipo de Experiencia</Operacion>
      </Modulo>
      <Modulo id ="8" nombre ="Usuarios">
       <Operacion form="C_Usuarios" tipo="Agregar">Registrar Usuario</Operacion>
       <Operacion form="R_Usuarios" tipo="Modificar">Modificar Usuario</Operacion>
       <Operacion form="U_Usuarios" tipo="Eliminar">Eliminar Usuario</Operacion>
       <Operacion form="D_Usuarios" tipo="Consultar">Consultar Usuario</Operacion>
      </Modulo>  
      <Modulo id ="9" nombre ="Tipos de Usuarios">
       <Operacion form="C_TUsuarios" tipo="Agregar">Registrar Tipo de Usuario</Operacion>
       <Operacion form="R_TUsuarios" tipo="Modificar">Modificar Tipo de Usuario</Operacion>
       <Operacion form="U_TUsuarios" tipo="Eliminar">Eliminar Tipo de Usuario</Operacion>
       <Operacion form="D_TUsuarios" tipo="Consultar">Consultar Tipo de Usuario</Operacion>
      </Modulo>
     </Modulos>
    </MenuPrincipal>
    

     


    El método que llena el TreeView con el XML:

     

    private void cargarArbol()
        {
          XElement doc = XElement.Load(@"../../MenuPrincipal.xml");
    
          TreeNode modulos;
          int contador = 1;
    
          foreach (XElement modulo in doc.Descendants("Modulo"))
          {
            modulos = this.ArbolPrincipal.Nodes.Add(modulo.Attribute("nombre").Value);
    
            foreach (XElement operaciones in modulo.Descendants("Operacion"))
            {
              TreeNode elemento = new TreeNode(operaciones.Value);
              elemento.Name = "item" + contador;
    
              elemento.Tag = new ItemsMenu
              {
                descripcion = elemento.Text,
                tipo = "tipo " + contador,
                formulario = operaciones.Attribute("form").Value
              };
    
              modulos.Nodes.Add(elemento);
              contador++;
            }
          }
        }
    

     

    La clase ItemsMenu que se usa en los Tags de cada TreeNode.

    class ItemsMenu
      {
        public string descripcion { get; set; }
        public string tipo { get; set; }
        public string formulario { get; set; }
      }
    


    Nótese que utilizo la propiedad Tag de cada TreeNode para almacenar las propiedades de cada nodo donde se destaca el atributo formulario que es el que quiero usar para llamar a los formularios.

     

    El evento al realizar doble-click sobre algún nodo:

    private void ArbolPrincipal_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          ItemsMenu etiqueta = (ItemsMenu)e.Node.Tag;
    
          if (etiqueta != null)
          {
            MessageBox.Show("Formulario: " + etiqueta.formulario);        
            //Mandar a llamar el formulario con etiqueta.formulario        
          }
        }


    Alli simplemente imprimí el nombre del formulario haber si los datos llegaban bien y efectivamente así es. El problema es que no se como instanciar las diferentes clases (que son los formularios) solo con el valor (string) que devuelve etiqueta.formulario (por ejemplo, "C_Usuarios") 

    En otras palabras, lo que deseo es ahorrarme la gran cantidad de líneas de código escribiendo un SWITCH con cada atributo y dentro de cada CASE llamar a cada formulario.

    Espero puedan ayudarme, saludos y muchas gracias! 

    martes, 12 de julio de 2011 22:48

Respuestas

Todas las respuestas