none
Duda con referencia entre proyectos en una solucion para llamar formularios. RRS feed

  • Pregunta

  • Saludos amigos.

    Les cuento, que estoy realizando lo siguiente, he creado una biblioteca de clases para personalizar algunos controles de VS 2013 en C#(proyecto ControlesAuxiliares), luego me he creado un proyecto con la intención de gestionar la autentificación y administración de usuarios para las aplicaciones que se vayan creado (proyecto Login).

    Ahora bien y espero no se lea muy refuscado y darme a entender; me he creado un 3er proyecto donde he agregado al proyecto ControlesAuxiliares y al proyecto Login, quedando los 3 proyectos dentro de una misma solucion; ya defini como de inicio al proyecto ReDi. Lo que hice ahora fue llamar desde el proyecto ReDi al formulario de FrmSplash que esta dentro del proyecto Login y lo he hecho así y es funcional:

    (Codigo program.cs del proyecto ReDi)

    using Login.Presentacion;

    namespace DSI.ReDi
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FrmSplash sp = new FrmSplash();
                if (sp.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new Login.Presentacion.FrmLogin());    
                }
            }
        }
    }

    Obviamente, he agregado la referencia al proyecto ReDi del proyecto Login, mi error o más bien desconocimiento de como llevarlo correctamente a cabo consiste en el formulario de FrmLogin (adjunto imagen) el cual esta dentro del proyecto Login en su boton Ingresar, pretendo llamar al formulario FrmEscanear que esta en el proyecto ReDi, intente agregar una referencia al proyecto Login del proyecto ReDi pero esto es ciclico ya que hay una referencia previa en el proyecto ReDi del proyecto Login , por lo que no puedo llamar al formulario deseado.

    Estos son los namespaces de los proyectos:

    ControlesAuxiliares namespaces Controles.Auxiliares

    Login namespace Login

    ReDi namespace DSI.ReDi

    Cualquier ayuda, mucho les he de agradecer.

    Hasta luego

    Marco Méndez

    martes, 3 de febrero de 2015 23:43

Respuestas

  • hola

    pero porque no usas algo como ser

    namespace DSI.ReDi
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    			
                FrmSplash sp = new FrmSplash();
                sp.ShowDialog();
                
    	    Login.Presentacion.FrmLogin login = new Login.Presentacion.FrmLogin();
    			
                if (login.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new frmEscanear());    
                }
                  
                
            }
        }
    }

    o sea abres el login de la misma forma que abres el splash, controlando el cierre si esta ok el login entonces poner al form de escanar como principal en el application.Run()

    del splash no se requiere controlar el enter simplemente que siga la ejecucion cuando se cierre

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Marco Bueno jueves, 5 de febrero de 2015 22:59
    miércoles, 4 de febrero de 2015 10:59

Todas las respuestas

  • en tu formulario Login puedes lanzar un evento cuando se pulse Ingresar y en el código de ReDi suscribirte a ese evento. Así evitarás la referencia circular.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 4 de febrero de 2015 0:15
  • Saludos amigo Sergio Parra.

    Gracias por la idea, pero creo ya ando muy embotado y aparte recien me familiarizo con VS C#; ya nos estamos aplicando pero soy usuario novato, me podría de favor detallar con algún enlace que hable al respecto o bien si  dispone de tiempo...; demostrar con codigo, el como lanzar un evento para llamar al form "frmEscanear" del  proyecto ReDi desde el proyecto Login.

    De antemano muchas gracias.

    Atentamente.- Marcos Méndez


    • Editado Marco Bueno miércoles, 4 de febrero de 2015 4:14 Ortografía.
    miércoles, 4 de febrero de 2015 4:10
  • Perdona por contestar tarde... ya sabes la diferencia horaria con España.

    Bueno ahí va el ejemplo

    En tu form FrmLogin agregas esto

    public delegate void ucPressEnter(object sender);
    public event ucPressEnter PressEnter;
    
    protected virtual void OnPressEnter()
    {
        if (PressEnter != null) PressEnter(this); // si el evento está suscrito lo lanzamos
    }

    En el código del evento click del botón ingresar agregas el lanzamiento del evento

    this.OnPressEnter();

    Luego en tu main tienes que asociar el evento PressEnter de FrmLogin con un manejador para que levante el frmEscanear

    using Login.Presentacion; 
    
    namespace DSI.ReDi
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FrmSplash sp = new FrmSplash();
                if (sp.ShowDialog() == DialogResult.OK)
                {
    		Login.Presentacion.FrmLogin frmLogin = new Login.Presentacion.FrmLogin();
    		frmLogin.PressEnter += frmLogin_PressEnter; // nos suscribimos al evento
    				
                    Application.Run(frmLogin);    
                }
            }
    		
    	private static void frmLogin_PressEnter(object sender)
            {
               FrmEscanear frmEscanear = new frmEscanear();
    		   frmEscanear.Show();
            }
        }
    }
    Espero te funcione... y sea eso lo que necesites


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    miércoles, 4 de febrero de 2015 8:42
  • hola

    pero porque no usas algo como ser

    namespace DSI.ReDi
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    			
                FrmSplash sp = new FrmSplash();
                sp.ShowDialog();
                
    	    Login.Presentacion.FrmLogin login = new Login.Presentacion.FrmLogin();
    			
                if (login.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new frmEscanear());    
                }
                  
                
            }
        }
    }

    o sea abres el login de la misma forma que abres el splash, controlando el cierre si esta ok el login entonces poner al form de escanar como principal en el application.Run()

    del splash no se requiere controlar el enter simplemente que siga la ejecucion cuando se cierre

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Marco Bueno jueves, 5 de febrero de 2015 22:59
    miércoles, 4 de febrero de 2015 10:59
  • Saludos !

    Muchas gracias amigo Sergio por el tiempo que te tomastes en ilustrar con codigo, lo implemente sin errores pero no lleva a cabo la acción de llamar ahora para efectos de la aplicación sera en lugar del form frmEscanear un form MDIReDi del proyecto ReDi, te comento lo siguiente, en el codigo del frmLogin del proyecto Login, al depurar observo que no lanza el evento debido a que no entra al if del PressEnter el cual siempre esta en null:

            public delegate void ucPressEnter(object sender);
            public event ucPressEnter PressEnter;

            protected virtual void OnPressEnter()
            {
                if (PressEnter != null)
                    PressEnter(this); // si el evento está suscrito lo lanzamos
            }

            private void boton1_Click(object sender, EventArgs e)
            {
                this.OnPressEnter();
            }

    Disculpa la molestia pero a crees que se deba?. Gracias.


    • Editado Marco Bueno miércoles, 4 de febrero de 2015 17:30 Actualizar codigo.
    miércoles, 4 de febrero de 2015 16:58
  • eso es porque no te suscribiste al evento como te puse

     Login.Presentacion.FrmLogin frmLogin = new Login.Presentacion.FrmLogin();
      frmLogin.PressEnter += frmLogin_PressEnter; // nos suscribimos al evento

    revisalo ok? Y nos cuentas. Gracias


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    • Editado Sergio Parra miércoles, 4 de febrero de 2015 17:14
    miércoles, 4 de febrero de 2015 17:14
  • se me olvidó poner frmLogin.PressEnter... Sorry. Ya edité el código en mi primer ejemplo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 4 de febrero de 2015 17:16
  • Amigo Leandro!

    Muchas gracias por tu orientación ahora en WinForms antes por ahi habia recibido tu apoyo con Asp...; bien te comento que aplique el codigo que me comentas, y me fue funcional, pero resulta que pretendo que en el proyecto login se administre los accesos de los usuarios para las distintas aplicaciones que se iran elaborando. Por lo que requiero de validar segun el usuario el acceso a la aplicacion desde el formulario de frmLogin que esta en el proyecto Login para que ahora mande llamar ya no al frmEscanear si no a un fomr MDI.

    Donde el amigo Sergio me oriento en lanzar al form de la siguiente manera, pero le comente a el previamente, respecto al codigo que amablemente me compartio, donde al pulsar click en el boton Iniciar en el form frmLogin del proyecto login, este no hacia nada, por lo que depure y obeserve que PressEnter mantiene su valor en null y de entrar al contenido del if, se emite una referencia igual nula...

            public delegate void ucPressEnter(object sender);
            public event ucPressEnter PressEnter;

            protected virtual void OnPressEnter()
            {
                if (PressEnter != null)
                    PressEnter(this); // si el evento está suscrito lo lanzamos
            }

            private void boton1_Click(object sender, EventArgs e)
            {
                this.OnPressEnter();
            }

    De antemano muchas gracias.

    miércoles, 4 de febrero de 2015 17:29
  • >>Por lo que requiero de validar segun el usuario el acceso a la aplicacion desde el formulario de frmLogin que esta en el proyecto Login para que ahora mande llamar ya no al frmEscanear si no a un fomr MDI.

    pero es lo mismo solo cambias el form

    Application.Run(new frmNombreFormMDI());    

    tu decides cual se inicia despues del login pase correctamente

    el form de login ademas del simple ok podria aportar informacion extra como ser el perfil de la persona, pero que no sea el login quien tiene la reponsabilidad de decidir que form abrir

    que el login exponga una propiedad con ese dato

    Login.Presentacion.FrmLogin login = new Login.Presentacion.FrmLogin(); if (login.ShowDialog() == DialogResult.OK) {

    if(login.Rol == "user") Application.Run(new frmEscanear());

    else

    Application.Run(new frmNombreFormMDI());  }

    es el login quien aporta los datos del rol para decidir que form abrir

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 4 de febrero de 2015 17:44
  • Saludos amigo Sergio!

    Muchas gracias por el apoyo me funciono excelente, batalle un poco... pero nombre hermano me fue de gran ayuda, le hice unos ajustes más para que fuera funcional, pero ya quedo... te agradezco amigo.

    Atentamente Marco
    jueves, 5 de febrero de 2015 22:59
  • Saludos amigo Leandro!

    Muchas gracias me di a la tarea de probar el codigo e idea que me compartistes, y funciono genial, solo te comento como soy usuario novato no supe asignar una propiedad al frmLogin del proyecto login, o bueno no se si lo lleve a cabo bien, ya que no me aparecio la propiedad dentro de las propiedades del form valga la redundancia, lo hice así:

    En el codigo del frmLogin hice lo siguiente al definir dos propiedades que en teoria deben de ser lo capturado en el textbox de usuario y en el combo de aplicación a abrir:

        public partial class FrmLogin : Form
        {
            [Description("Texto de la etiqueta superior"), Browsable(true)]
            public string ImportarUsuario
            {
                get { return this.txtUsuario.Text; }
                set { this.txtUsuario.Text = value; }
            }

            public string ImportarAplicacion
            {
                get { return this.cmbAplicacion.Text; }
                set { this.cmbAplicacion.Text = value; }
            }

           .....

          // En la propiedad click del boton hice lo siguiente para asignar valores a las propiedades del form....

           private void btnIngresar_Click(object sender, EventArgs e)
            {

               rpe = txtUsuario.Text.Trim();
                pasw = txtContrasena.Text.Trim();
                try
                {
                    DataSet ds = FLogin.ValidarLogin(rpe, pasw);
                    dt = ds.Tables[0];
                    if (dt.Rows.Count > 0)
                    {

                        // Cuando lo ejecute mi intencion era rescatar el usuario que entra y la aplicación elegida para

                        // mostrar en el MDIForm del proyecto ReDi

                        this.ImportarUsuario = txtUsuario.Text;
                        this.ImportarAplicacion = cmbAplicacion.Text;  

                        this.DialogResult = DialogResult.OK;
                    }
                    else
                    {

                        MessageBox.Show("Usuario y/o contraseña incorrectos.");
                        txtContrasena.Text = "";
                    }
                }        

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + ex.StackTrace);
                    throw;
                }

           }

    En el program.cs del proyecto ReDi llame al formulario MDIReDi pero no logre rescatar los valores de las propiedades del fmrlogin del proyecto Login...

    Muchas gracias por el tiempo Leandro y la molestia de colocar codigo.

    jueves, 5 de febrero de 2015 23:20