none
Cerrar un formulario desde una clase login RRS feed

  • Pregunta

  • Saludos, mi inquietud surge en torno a que estoy desarrollando un login usando una base de datos sql y tengo una clase para que se conecte y realice la validación, pero al cargar el formulario no cierra la pantalla del login, he buscado en toda la web en busca de ayuda y no lo he conseguido.

    Aqui un ejemplo de la clase usada 

    public void entrar(TextBox Usuario, TextBox Clave)
            {
                SqlConnection cn = new SqlConnection(@"Data Source=.\ELCHAGO5; Initial Catalog=ZOQGRAPH; Integrated Security=true;");
                cn.Open();
    
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("select * from USUARIO where usuario = @NOMUS and clave = @CLAUS", cn);
                da.SelectCommand.Parameters.AddWithValue("@NOMUS", Usuario.Text);
                da.SelectCommand.Parameters.AddWithValue("@CLAUS", Clave.Text);
    
                da.Fill(dt);
    
                if (dt.Rows.Count > 0)
                {
                    Form Principal = new frmPrincipal();
                    Principal.Show();
    
                    frmLogin login = new frmLogin();
                    login.Close();
                }
                else
                {
                    MessageBox.Show("Usuario o clave incorrecta, favor verificar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                cn.Close();            
            }

    Quisiera saber porqué no se cierra la pantalla del login, ayuda por favor.

    Gracias.

    domingo, 31 de mayo de 2015 21:30

Respuestas

  • Hola Ramón Zoquier prueba de la siguiente manera tendrás que agregar un nuevo parámetro y todo te funcionara correctamente:

    public void entrar(TextBox Usuario, TextBox Clave,Form frm)
            {
                SqlConnection cn = new SqlConnection(@"Data Source=.\ELCHAGO5; Initial Catalog=ZOQGRAPH; Integrated Security=true;");
                cn.Open();
    
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("select * from USUARIO where usuario = @NOMUS and clave = @CLAUS", cn);
                da.SelectCommand.Parameters.AddWithValue("@NOMUS", Usuario.Text);
                da.SelectCommand.Parameters.AddWithValue("@CLAUS", Clave.Text);
    
                da.Fill(dt);
    
                if (dt.Rows.Count > 0)
                {
                    frm.Hide();
                    Form Principal = new frmPrincipal();
                    Principal.Show();
                }
                else
                {
                    MessageBox.Show("Usuario o clave incorrecta, favor verificar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                cn.Close();            
            }

    Y en tu formulario que usas en tu evento click de un button deberías especificar los parámetros de la siguiente manera:

            private void btnIngresar_Click(object sender, EventArgs e)
            {
                Login x = new Login();
                x.entrar(txtUsuario.Text, txtClave.Text, this);
            }
    Espero haberte ayudado.
    • Marcado como respuesta Ramón Zoquier domingo, 31 de mayo de 2015 22:27
    domingo, 31 de mayo de 2015 21:57

Todas las respuestas

  • Hola Ramón Zoquier no deberias de cerrar la ventana login, solo deberias ocultar puesto que si cierras la ventana login se cerraria todo, por que esa ventana da origen a las demas que abriras, en tu codigo no se cerrara por que es una nueva instancia de ese mismo formulario, si lo que quieres es cerrar el mismo formulario login (el que estas usando actualmente) usarias this.Close();, pero como te mencionaba se cerraría todo (Da por finalizado todo el proceso, es por eso que se recomienda solo ocultarla).

    public void entrar(TextBox Usuario, TextBox Clave)
            {
                SqlConnection cn = new SqlConnection(@"Data Source=.\ELCHAGO5; Initial Catalog=ZOQGRAPH; Integrated Security=true;");
                cn.Open();
    
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("select * from USUARIO where usuario = @NOMUS and clave = @CLAUS", cn);
                da.SelectCommand.Parameters.AddWithValue("@NOMUS", Usuario.Text);
                da.SelectCommand.Parameters.AddWithValue("@CLAUS", Clave.Text);
    
                da.Fill(dt);
    
                if (dt.Rows.Count > 0)
                {
                    this.Hide();
                    Form Principal = new frmPrincipal();
                    Principal.Show();
                }
                else
                {
                    MessageBox.Show("Usuario o clave incorrecta, favor verificar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                cn.Close();            
            }

    Espero haberte ayudado.


    domingo, 31 de mayo de 2015 21:38
  • Gracias por tu pronta respuesta, sucede que me marca error al utilizar this.Hide() ya que este código se ejecuta en una clase que creé llamada Login.cs y no desde el formulario principal.

    domingo, 31 de mayo de 2015 21:46
  • Hola Ramón Zoquier prueba de la siguiente manera tendrás que agregar un nuevo parámetro y todo te funcionara correctamente:

    public void entrar(TextBox Usuario, TextBox Clave,Form frm)
            {
                SqlConnection cn = new SqlConnection(@"Data Source=.\ELCHAGO5; Initial Catalog=ZOQGRAPH; Integrated Security=true;");
                cn.Open();
    
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter("select * from USUARIO where usuario = @NOMUS and clave = @CLAUS", cn);
                da.SelectCommand.Parameters.AddWithValue("@NOMUS", Usuario.Text);
                da.SelectCommand.Parameters.AddWithValue("@CLAUS", Clave.Text);
    
                da.Fill(dt);
    
                if (dt.Rows.Count > 0)
                {
                    frm.Hide();
                    Form Principal = new frmPrincipal();
                    Principal.Show();
                }
                else
                {
                    MessageBox.Show("Usuario o clave incorrecta, favor verificar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                cn.Close();            
            }

    Y en tu formulario que usas en tu evento click de un button deberías especificar los parámetros de la siguiente manera:

            private void btnIngresar_Click(object sender, EventArgs e)
            {
                Login x = new Login();
                x.entrar(txtUsuario.Text, txtClave.Text, this);
            }
    Espero haberte ayudado.
    • Marcado como respuesta Ramón Zoquier domingo, 31 de mayo de 2015 22:27
    domingo, 31 de mayo de 2015 21:57
  • hola

    tengamos dos puntos en mente

    - nunca deberias cerrar un form desde una clase cuya responsabilidad es autenticar

    - nunca oculte el form de login, el login debe realizarse previo a lanzar el form principal

    aqui

    Login – Usando Password con Hash

    explico como podrias hacerlo, la idea es que el login lo realizas en el Main() de Program.cs entonces inicias el form de login y luego de pasada la autenticacion es que asignas el form principal en el Application.Run()

    o sea ocultar el form de login esta mal

    el metodo de autenticaicon deberia ser

    public bool ValidarLogin(TextBox Usuario, TextBox Clave)
    {
    	string connstring = @"Data Source=.\ELCHAGO5; Initial Catalog=ZOQGRAPH; Integrated Security=true;";
    	
    	using(SqlConnection cn = new SqlConnection(connstring))
    	{
    		cn.Open();
    
    		string query = "select COUNT(*) from USUARIO where usuario = @NOMUS and clave = @CLAUS";
    		SqlCommand cmd = new SqlCommand(query, cn);
    		cmd.Parameters.AddWithValue("@NOMUS", Usuario.Text);
    		cmd.Parameters.AddWithValue("@CLAUS", Clave.Text);
    
    		int rows = Convert.ToInt32(cmd.ExecuteScalar());
    
    		return rows > 0;
    		 
    	}
    }

    como veras solo valida y retorna un bool de respuesta

    desde el form de login invocas esta funcionalidad para conocer si debes continuar para abrir el form principal o no

    pero esto lo realizas desde el Main como explico en el articulo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    domingo, 31 de mayo de 2015 22:28
  • He podido solucionar el problema gracias a tu ayuda, de nuevo muchas gracias.
    domingo, 31 de mayo de 2015 22:28