none
Como obtener los formularios y la cantidad de formularios de un Proyecto???

    Question

  • Saludos.

    La duda con la vengo hoy es la siguiente:

    ¿Como hago para sacar la lista de "Forms" que existen en un Proyecto C#?

    Es decir.
    Yo quiero leer de un Proyecto determinado, y obtener de ese proyecto todos los "Forms" que posee, para luego agregar el nombre de esos Forms en un comboBox.

    Gracias por su tiempo.

    Wednesday, March 02, 2011 5:11 AM

Answers

  • hola

    poder se puede pero no es tan directo, el tema es que esto tendria que acceder al VS para obtener esta informacion que solo estara disponible cuando trabajes en desarrollo, si quieres llevar a algun sitio ya no funcionara porque no contaras con el VS dodne leer esta informacion

    esto que quieres hacer viene por el lado de la extensibilidad del VS, por el lado de


    pero igual como comente esto solo funcionara mientras estes trabajndo con el VS, si llevas el desarrollo al usuario esto no aplica

    porque no creas una lista tu mismo de los formularios que posee el proyecto si es que quieres listarlos en un combo, podrias usar un List<string> con los nombres de todos los forms

    List<string> listForms = new List<string>();

    listForms.Add("AltaUsuario");
    listForms.Add("AdminRoles");
    .
    .

    esto podrias bindearlo a un combo sin problemas


    mira este ejemplo de programa de consola

    using System;

     

    using EnvDTE;

    using EnvDTE80;

     

    namespace DTETest

    {

     

        class Program

        {

            static void Main(string[] args)

            {

               

                DTEHelper.GetImports();

     

                Console.ReadKey();

     

            }

        }

     

     

        public static class DTEHelper

        {

            #region DTE - Get Imports

     

            public static void GetImports()

            {

     

                EnvDTE.DTE _dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0");

     

                Solution _solution = _dte.Solution;

     

                Console.WriteLine(_solution.FullName);

     

     

                foreach (Project project in _solution.Projects)

                {

                    Console.WriteLine("\t{0}", project.Name);

     

                    foreach (ProjectItem item in project.ProjectItems)

                    {

     

                        Console.WriteLine("\t\t{0}", item.Name);

     

                        FileCodeModel codeModel = item.FileCodeModel;

     

                        if (codeModel == null)

                            continue;

     

                        //

                        // Process import for specific code file

                        //

                        GetClassImport(codeModel);

     

                    }

                }

     

     

     

     

            }

     

            public static void GetClassImport(FileCodeModel codeModel)

            {

     

                foreach (CodeElement element in codeModel.CodeElements)

                {

     

                    //Console.WriteLine("\t\t\t{0}", element.Kind);

     

                    if (element.Kind == vsCMElement.vsCMElementImportStmt)

                    {

                        CodeImport codeImport = (CodeImport)element;

     

                        Console.WriteLine("\t\t\t{0}", codeImport.Namespace);

                    }

                }

            }

     

            #endregion

     

        }

     

    }



    veras comotoma este libreria que comento y de esta la solucion actual

    EnvDTE.DTE _dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0");                 Solution _solution = _dte.Solution;

    pero esto esta integrado al VS, si sales del mismo ya no funciona, porque es de la solucion de dodne se extrae la informacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, March 02, 2011 12:04 PM

All replies

  • hola

    poder se puede pero no es tan directo, el tema es que esto tendria que acceder al VS para obtener esta informacion que solo estara disponible cuando trabajes en desarrollo, si quieres llevar a algun sitio ya no funcionara porque no contaras con el VS dodne leer esta informacion

    esto que quieres hacer viene por el lado de la extensibilidad del VS, por el lado de


    pero igual como comente esto solo funcionara mientras estes trabajndo con el VS, si llevas el desarrollo al usuario esto no aplica

    porque no creas una lista tu mismo de los formularios que posee el proyecto si es que quieres listarlos en un combo, podrias usar un List<string> con los nombres de todos los forms

    List<string> listForms = new List<string>();

    listForms.Add("AltaUsuario");
    listForms.Add("AdminRoles");
    .
    .

    esto podrias bindearlo a un combo sin problemas


    mira este ejemplo de programa de consola

    using System;

     

    using EnvDTE;

    using EnvDTE80;

     

    namespace DTETest

    {

     

        class Program

        {

            static void Main(string[] args)

            {

               

                DTEHelper.GetImports();

     

                Console.ReadKey();

     

            }

        }

     

     

        public static class DTEHelper

        {

            #region DTE - Get Imports

     

            public static void GetImports()

            {

     

                EnvDTE.DTE _dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0");

     

                Solution _solution = _dte.Solution;

     

                Console.WriteLine(_solution.FullName);

     

     

                foreach (Project project in _solution.Projects)

                {

                    Console.WriteLine("\t{0}", project.Name);

     

                    foreach (ProjectItem item in project.ProjectItems)

                    {

     

                        Console.WriteLine("\t\t{0}", item.Name);

     

                        FileCodeModel codeModel = item.FileCodeModel;

     

                        if (codeModel == null)

                            continue;

     

                        //

                        // Process import for specific code file

                        //

                        GetClassImport(codeModel);

     

                    }

                }

     

     

     

     

            }

     

            public static void GetClassImport(FileCodeModel codeModel)

            {

     

                foreach (CodeElement element in codeModel.CodeElements)

                {

     

                    //Console.WriteLine("\t\t\t{0}", element.Kind);

     

                    if (element.Kind == vsCMElement.vsCMElementImportStmt)

                    {

                        CodeImport codeImport = (CodeImport)element;

     

                        Console.WriteLine("\t\t\t{0}", codeImport.Namespace);

                    }

                }

            }

     

            #endregion

     

        }

     

    }



    veras comotoma este libreria que comento y de esta la solucion actual

    EnvDTE.DTE _dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0");                 Solution _solution = _dte.Solution;

    pero esto esta integrado al VS, si sales del mismo ya no funciona, porque es de la solucion de dodne se extrae la informacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, March 02, 2011 12:04 PM
  • Saludos Leandro.

    Gracias por comentarme eso.

    Te explico exactamente lo que estoy tratando de conseguir.

    - Quiero mostrar en un combo el nombre de cada formulario que tiene el proyecto.

    - Una vez seleccionado el formulario (el nombre), se debe cargar un treeview con todos los controles que posee ese formulario.

     

    Ahi se me complica un poco más. Y por más vueltas q le doy no llego a una solución que me permitar cargar la lista de controles cuando selecciono el formulario.

    Gracias Nuevamente Leandro.

     

    Wednesday, March 02, 2011 2:50 PM
  • hola

    mm entonces es como comento debes buscar por el lado de Visual Studio Extensibility, por eso mencione el EnvDTE, este permite acceder a los componentedel VS

    pero como tambien mencione esto solo seguir funcionando mientras estes trabjando con el VS porque es algo integrado al mismo, no podras redistribuir esto a los cliente sino posee el VS con la solucion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, March 02, 2011 3:42 PM
  • bueno, aparte de la opción de Leandro, lo puedes obtener de la siguiente manera:

        private IList<FormList> GetFormList()<br/>
        {<br/>
          IList<FormList> lista = new List<FormList>();<br/>
          Module[] modulos = Assembly.GetExecutingAssembly().GetModules();<br/>
          foreach (Module m in modulos)<br/>
          {<br/>
            string nameSpace = m.Assembly.GetName().Name;<br/>
            Type[] tipos = m.GetTypes();<br/>
            foreach (Type t in tipos)<br/>
            {<br/>
              if (t.IsSubclassOf(typeof(Form)))<br/>
                lista.Add(new FormList() { Name = t.Name, FullName = t.FullName });<br/>
            }<br/>
          }<br/>
    <br/>
          return lista;<br/>
        }<br/>
    
    
      public class FormList<br/>
      {<br/>
        public string Name { get; set; }<br/>
        public string FullName { get; set; }<br/>
      }<br/>
    
    

    asi podrias obtener una lista de todos los formularios en tiempo de ejecución con o sin el visual studio instalado, bueno!!!... por lo menos yo asi lo uso y me funciona sin problema.

    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    Wednesday, March 02, 2011 7:11 PM
    Moderator
  • hola Marvin

    que bueno no se me habia pensado en usar Reflexion, lo pense desde el lado del VS, y no de la instancia de objectos

    una buena idea

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, March 02, 2011 7:18 PM
  • si, entiendo... ojo con el código!!!...

    la clase FormList tienes dos propiedades

    Name y FullName, con FullName tendras que crear la instancia al formulario para asi usando reflexion obtengas la lista de controles del formulario

    assemblyName = lista[0].FullName;
    ObjectHandle oh = Activator.CreateInstanceFrom(Assembly.GetExecutingAssembly().CodeBase, assemblyName);
    form = oh.Unwrap() as Form;
    
    
    Salu2,


    Marvin E. Pineda

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Aún el necio cuando calla, es contado por sabio.
    Wednesday, March 02, 2011 7:24 PM
    Moderator