none
Como abrir un formulario sin utilizar la palabra clave New RRS feed

  • Pregunta

  • Saludos, necesito saber como puedo referenciar un formulario sin crear un objeto del mismo EJ: En vb.net seria asi:

    Dim variable as NombreForm y no Dim variable as NombreForm = new NombreForm() pero en C# (Donde trabajo actualmente)

    solo he visto la segunda Opción y requiero la primera. 


    • Editado Renzo20 miércoles, 7 de marzo de 2018 21:09
    miércoles, 7 de marzo de 2018 21:08

Respuestas

  • Hola muchachos, ya logre resolverlo. Encontre en la web una pregunta similar, es decir ¿Como abrir una vez la instancia de un formulario me parece que era la pregunta, la solución fue:

     private static Principal m_FormDefInstance;
    
            public static Principal DefInstance
            {
                get
                {
                    if (m_FormDefInstance == null || m_FormDefInstance.IsDisposed)
                        m_FormDefInstance = new Principal();
                    return m_FormDefInstance;
                }
                set
                {
                    m_FormDefInstance = value;
                }
            }

    Entonces desde donde quiero abrirlo : DefInstance.Show();

    Pero muchas gracias por la ayuda, la atención y las respuestas!!

    jueves, 8 de marzo de 2018 19:22

Todas las respuestas

  • El detalle es que en VB.net la parte de new está escondida, pero está.  Simplemente use new y listo.  No hay más.

    Jose R. MCP
    Code Samples

    miércoles, 7 de marzo de 2018 21:10
    Moderador
  • No es que no lo quiera poner por gusto es que se me presento un problema lógico debido a esto, me explico:

    El formulario principal no puedo abrirlo 2 veces y con el new es lo que hace cada vez que uso el .Show() del objeto creado de ese Form, segundo quiero poder cambiarle el texto a label del formulario principal desde otro formulario(el login) si utilizo lo siguiente:

     Principal P = new Principal();
     P.lblUsuarioActual.Text = txtUsuario.Text;

    No me funciona... Por eso me preguntaba si es posible usar un formulario sin tener que crear un objeto instancia de el (sin el new)

    miércoles, 7 de marzo de 2018 21:35
  • Hola, podráis utilizar el ShowDialog en lugar del show

    Pasar datos entre forms


    Votar es agradecer.
    Saludos.
    Lima-Perú

    miércoles, 7 de marzo de 2018 21:53
  • Ok, comprendo.  Lo que desea es pasar datos entre formularios.  Y digo datos, no digo otra cosa.  Cosas como "quiero que un formulario altere el control (etiqueta, grilla, etc.) de otro" no es lo correcto.

    En su formulario principal, agregue una propiedad Usuario:

    private Usuario m_usuario;
    public Usuario Usuario
    {
        get { return m_usuario; }
        set
        {
            m_usuario = value;
            if (m_usuario == null)
            {
                lblUsuarioActual.Text = null;
            }
            else
            {
                lblUsuarioActual.Text = m_usuario.Name; //O Username, o DisplayName, lo que sea que quiera.
            }
        }
    }

    Donde el tipo de datos Usuario sería una clase que representa al usuario de la aplicación.  Ponga usted el tipo que más le convenga, siempre que no invalide el espíritu de lo que le estoy presentando.

    Ahora supongo que tiene un formulario de login que es el formulario 2 al que se refiere usted.  A ese cámbiele el constructor (o agregue uno):

    //Una propiedad que necesitamos para poder pasarle datos al formulario principal.
    public Principal FormularioPrincipal { get; private set; }
    
    //Si el formulario de log in se llama LogIn, entonces el constructor sería:
    public LogIn(Principal fmPrincipal)
    {
        FormularioPrincipal = fmPrincipal;
    }

    Ahora bien, cuando presenta el formulario de Login, tiene que hacer new LogIn(), ¿cierto?  Ahiora sería new LogIn(this), si es que lo llama desde el formulario principal.

    Supongo que hay algún botón de OK o similar en el formulario de login, que lo primero que hace es ver si las credenciales son correctas.  Pues bueno, si son correctas entonces pásele la información del usuario al formulario principal:

    FormularioPrincipal.Usuario = new Usuario(txtUsername.Text); //O algo similar.  Construye el objeto y se lo da al formulario.

    En cuanto eso se ejecuta, el formulario principal sabrá que tiene que actualizar la etiqueta de nombre y listo.  Y esta es la forma correcta de compartir datos entre formularios, al menos la forma más basica.


    Jose R. MCP
    Code Samples

    miércoles, 7 de marzo de 2018 23:13
    Moderador
  • Hola, antes de todo considere lo siguiente:

    Acción 1

    Abro el login

    Acción 2

    en el botón Ok (txtIniciar) Valido los datos y de ser correcta la inf. suministrada...

    Principal P = new Principal();

    P.Show(); //Abre el formulario principal

    Acción 3 -Se desea cambiar de usuario

    Abre el login nuevamente

    Acción 4 -Nuevamente se evalúa la info. suministrados y de ser correcto abre el formulario principal

    Aquí es donde esta el problema! lo primero que necesito es que si ya esta abierto el formulario principal

    únicamente le pase los datos al lblUsuarioActivo.Text y que no vuelva ha abrirse, se que es algo simple y me disculpo por la ignorancia.


    • Editado Renzo20 jueves, 8 de marzo de 2018 4:41
    jueves, 8 de marzo de 2018 4:40
  • Entonces el cambio es sencillo.  Lo que falta es cubrir el paso 2.

    Tiene 2 opciones:

    1. Cuando crea por primera vez el formulario de LogIn, también crea un formulario principal para pasarle al constructor del formulario de LogIn.
    2. Forza la creación del formulario principal en el constructor de LogIn si es que no se pasa uno por parámetro.

    Yo haría el 2:

    LogIn fmLogin = new LogIn(); //Nótese que no paso nada.  Para que esto compile, le voy a hacer un cambio al constructor.
    
    //Este sería el constructor de LogIn:
    public LogIn(Principal fmPrincipal = null)
    {
        if (fmPrincipal == null)
        {
            fmPrincipal = new Principal();
        }
        FormularioPrincipal = fmPrincipal;
    }

    Los cambios en negrita.


    Jose R. MCP
    Code Samples

    jueves, 8 de marzo de 2018 8:04
    Moderador
  • Dim variable as NombreForm y no Dim variable as NombreForm = new NombreForm() pero en C# (Donde trabajo actualmente)

    La cuestón es que el VB tiene "trampa". En realidad sí que hace el New internamente aunque no lo veas en el código fuente. Cuando abres la primera instancia del Form, VB la guarda internamente mediante el equivalente de "Public Shared Form1 as New Form1()", es decir, declara una variable estática con el mismo nombre que el formulario, y mete dentro una instancia con el New.

    En C# esa declaración "interna" no ocurre automáticamente, pero nada te impide escribirla tú mismo:

    public static Form1 Form1 = new Form1();

    Y luego al llamarla llamas a miclase.Form1, siendo miclase la clase en la que metiste el "public static...".

    Mi recomendación sería que, si haces eso, entonces para evitar confusión no llames a la instancia igual que a la clase, sino que le pongas otro nombre.

    jueves, 8 de marzo de 2018 13:57
    Moderador
  • Hola Alberto Poblacion prove lo siguiente... en otra clase coloque

       public static Principal Princi = new Principal();

    luego en el formulario de Login (Desde donde deseo abrirlo una sola vez) coloque lo siguiente:

     Global G = new Global(); //Global es la clase donde coloque:  public static Principal Princi = new Principal();
      G.Princi.Show(); //En esta linea marca error de acceso.

    Nota: Posiblemente no lo esté haciendo correctamente, me disculpo.

    jueves, 8 de marzo de 2018 16:15
  • Hola webJose A que te refieres con FormularioPrincipal debo crear un objeto instancia de dicha clase? no lo defines en tu bloque de codigo...

    //Este sería el constructor de LogIn:
    public LogIn(Principal fmPrincipal = null)
    {
        if (fmPrincipal == null)
        {
            fmPrincipal = new Principal();
        }
        FormularioPrincipal = fmPrincipal; //Aca!
    }

    jueves, 8 de marzo de 2018 16:17
  • Hola webJose A que te refieres con FormularioPrincipal debo crear un objeto instancia de dicha clase? no lo defines en tu bloque de codigo...

    //Este sería el constructor de LogIn:
    public LogIn(Principal fmPrincipal = null)
    {
        if (fmPrincipal == null)
        {
            fmPrincipal = new Principal();
        }
        FormularioPrincipal = fmPrincipal; //Aca!
    }


    El formulario principal es el que se muestra después de loguearse al sistema.  Eso es lo que tengo entendido.  Tengo entendido también que el formulario de LogIn es el primero que se muestra.

    FormularioPrincipal es una propiedad que definí en una respuesta anterior en esta conversación.  Es una propiedad que mantiene una referencia al formulario principal actual.  Si no hay ninguno actual a la hora de mostrar el LogIn, entonces el formulario LogIn se encarga de crear uno nuevo con esta modificación de código que le propuse.


    Jose R. MCP
    Code Samples

    jueves, 8 de marzo de 2018 16:21
    Moderador
  • Hola Augusto1982 si coloco el método ShowDialog() de esta forma:

     Principal p = new Principal();
            this.Hide();
                    p.ShowDialog();

    En este caso ocurre exactamente lo mismo, Ej: Busco principalmente que el formulario principal solo abra una vez y en el botón desde donde lo abro (el botón Ok del login...) está el bloque de código que coloque (esto es luego de que la validación es correcta). Y aun así se sigue abriendo una instancia nueva del form cuando intento cambiar de usuario utilizando el mismo login... :(


    jueves, 8 de marzo de 2018 16:29
  •   G.Princi.Show(); //En esta linea marca error de acceso.

    No, fíjate que precisamente hemos marcado la variable como "static" para evitar tener que instanciar la clase "Global". Las static se invocan con el nombre de la clase, no con la instancia:

    Global.Princi = new Principal(); // Esto solo una vez al principio de la ejecución del programa

    Global.Princi.Show(); // Esto en cualquier sitio cada vez que quieras mostrar ese mismo formulario.

    jueves, 8 de marzo de 2018 17:08
    Moderador
  • Hola Alberto Poblacion lo puse así:

     public Login()
            {
                InitializeComponent();
                //Utilizar skins adicionales del DevExpress
                DevExpress.UserSkins.BonusSkins.Register();
                DevExpress.Skins.SkinManager.EnableFormSkins();
                Global.Princi = new Principal();
            }

    y donde deseo abrir el formulario principal (Boton Ok del Login):  Global.Princi.Show();

    aun así se sigue abriendo varias veces ese formulario :( :(


    • Editado Renzo20 jueves, 8 de marzo de 2018 17:28
    jueves, 8 de marzo de 2018 17:27
  • aun así se sigue abriendo varias veces ese formulario :( :(

    No puede ser. Tiene que haber algún error. Usa en Visual Studio la opción de "buscar todas las referencias" para buscar todas las ocurrencias del Global.Princi. Pon un punto de ruptura en cada una y ejecuta el programa con el debugger. Verifica que el "new" solo se ejecuta una vez. Y si eso falla (es decir, si se comprueba que solo se ejecuta una vez pero aún así se abre varias veces), entonces pon un punto de ruptura en la primera línea del constructor de la clase "Principal", y cuando se pare en esa línea examina la pila de llamadas a ver cómo se ha llegado hasta ahí. Si todo está bien programado, solo tiene que pararse ahí una única vez durante toda la ejecución del programa, y la pila de llamadas tiene que decir que se llegó hasta ahí desde el método Login(). Si se para más de una vez, entonces está mal el sitio desde el que se llega la segunda vez.
    jueves, 8 de marzo de 2018 18:32
    Moderador
  • Hola muchachos, ya logre resolverlo. Encontre en la web una pregunta similar, es decir ¿Como abrir una vez la instancia de un formulario me parece que era la pregunta, la solución fue:

     private static Principal m_FormDefInstance;
    
            public static Principal DefInstance
            {
                get
                {
                    if (m_FormDefInstance == null || m_FormDefInstance.IsDisposed)
                        m_FormDefInstance = new Principal();
                    return m_FormDefInstance;
                }
                set
                {
                    m_FormDefInstance = value;
                }
            }

    Entonces desde donde quiero abrirlo : DefInstance.Show();

    Pero muchas gracias por la ayuda, la atención y las respuestas!!

    jueves, 8 de marzo de 2018 19:22