2
votes

Comment appeler une méthode d'une autre classe dans une fenêtre?

J'ai donc une classe appelée "Utilisateur" dans laquelle j'ai la méthode et le code suivants:

public partial class LoginWindow:Window
{
     User u = new User();
     private void BtnSignup_Click(object sender, RoutedEventArgs e)
     {
         u.Login();
     }
}

Et dans ma fenêtre de connexion j'ai:

public void Login()
{
   LoginWindow l = new LoginWindow();
   if (l.tbxEmail.Text != "" && l.tbxPassword.Text != "")
   {
      string query = "SELECT * FROM UsersTBL";
      l.con.Open();
      l.com = l.con.CreateCommand();
      l.com.CommandText = query;
      SqlDataReader dr = l.com.ExecuteReader();
      if (dr.Read())
      {
         if (dr["Email"].Equals(l.tbxEmail.Text.ToString()) && dr["UserPassword"].Equals(l.tbxPassword.Text.ToString()))
         {
            AppWindow a = new AppWindow();
            a.Show();
         }
         else
            l.lblMissingParameter.Content = "Incorrect Password or Email entered";
      }
   }
}


9 commentaires

Que signifie «rien ne fonctionne»? Quelles erreurs obtenez-vous (le cas échéant)?


Donc, fondamentalement, lorsque je me connecte avec mon e-mail et que je passe, il est censé ouvrir une nouvelle fenêtre "AppWindow", mais cela ne se produit pas. Lorsque je clique sur le bouton de connexion avec mes informations d'identification entrées dans les zones de texte. La fenêtre de l'application ne s'affiche pas.


Avez-vous utilisé le débogueur pour voir ce qui se passe? Je suppose que vous devez afficher la boîte de dialogue de connexion, pas simplement la créer .


Pourquoi créez-vous une nouvelle LoginWindow dans votre méthode Login ?


Quelques choses. (1) vous ne lisez qu'une seule ligne de UsersTBL . Ce code échouera lorsqu'il y a plus d'un utilisateur. Vous pouvez résoudre ce problème en utilisant while (dr.Read ()) et en comparant toutes les lignes (ou mieux encore, utilisez WHERE ). (2) vous ne devez jamais stocker les mots de passe sous forme de texte brut. Ils devraient au moins être hachés.


@ Aars93 Je ne crée pas de LoginWindow dans ma méthode de connexion, je crée une nouvelle fenêtre d'application qui devrait s'ouvrir après avoir entré mes coordonnées.


Essayez de passer le tbxEmail et le tbxPassword en tant que paramètre pour la connexion.


@ ViníciusGabriel ok donc votre idée a fonctionné! J'ai dû passer tbxEmail, tbxPass, SqlConnection con, SqlCommadn com comme paramètres pour que la méthode de connexion fonctionne.


Mais que se passe-t-il si j'ai beaucoup de variables qui doivent être passées comme paramètres pour qu'une méthode fonctionne, cela ne serait-il pas inutile et inefficace?


3 Réponses :


0
votes

J'ai écrit une page de connexion rudimentaire pour l'un de mes projets scolaires semblable à celui-ci:

private void signInButton_Click(object sender, EventArgs e)
        {
            DataProcedures data = new DataProcedures();
            User userInfo = new User(usernameTextbox.Text, passwordTextbox.Text);
            userInfo.userId = data.verifyUser(userInfo);

            if (userInfo.userId != -1)
            {
                AppWindow a = new AppWindow();
                 a.Show();
            }
            else
            {
                errorLabel.Show();
            }
        }

public int verifyUser(User userInfo)
        {
            MySqlConnection conn = new MySqlConnection(connectionString);

            int userId = -1;

            string returnedUserName;
            string returnedPassword;

            try
            {
                conn.Open();
                MySqlCommand checkUserNameCmd = conn.CreateCommand();
                checkUserNameCmd.CommandText = "SELECT EXISTS(SELECT userName FROM user WHERE userName = @username)";
                checkUserNameCmd.Parameters.AddWithValue("@username", userInfo.username);
                returnedUserName = checkUserNameCmd.ExecuteScalar().ToString();

                MySqlCommand checkPasswordCmd = conn.CreateCommand();
                checkPasswordCmd.CommandText = "SELECT EXISTS(SELECT password FROM user WHERE BINARY password = @password AND userName = @username)";//"BINARY" is used for case sensitivity in SQL queries
                checkPasswordCmd.Parameters.AddWithValue("@password", userInfo.password);
                checkPasswordCmd.Parameters.AddWithValue("@username", userInfo.username);
                returnedPassword = checkPasswordCmd.ExecuteScalar().ToString();



                if (returnedUserName == "1" && returnedPassword == "1")
                {
                    MySqlCommand returnUserIdCmd = conn.CreateCommand();
                    returnUserIdCmd.CommandText = "SELECT userId FROM user WHERE BINARY password = @password AND userName = @username";
                    returnUserIdCmd.Parameters.AddWithValue("@password", userInfo.password);
                    returnUserIdCmd.Parameters.AddWithValue("@username", userInfo.username);
                    userId = (int)returnUserIdCmd.ExecuteScalar();
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception thrown verifying user: " + ex);
            }
            finally
            {
                conn.Close();
            }

            return userId;
        }

J'espère que cela vous aidera.


1 commentaires

Merci à tous pour votre aide!



1
votes

Cela devrait fonctionner, même si j'ai laissé des commentaires sur des choses qui devraient être traitées.

User class:

public partial class LoginWindow : Window
{
    private void BtnSignup_Click(object sender, RoutedEventArgs e)
    {
        var u = new User();
        if (u.Login(con, tbxEmail.Text, tbxPassword.Text))
        {
            AppWindow a = new AppWindow();
            a.Show();
        }
        else
            lblMissingParameter.Content = "Incorrect Password or Email entered";
    }
}

LoginWindow classe:

public bool Login(SqlConnection con, string email, string password)
{
    const string query = "SELECT 1 FROM UsersTBL WHERE Email = @email AND UserPassword = @password";
    if (!string.IsNullOrWhiteSpace(email) && !string.IsNullOrWhiteSpace(password))
    {
        try
        {
            con.Open();
            var cmd = con.CreateCommand();
            cmd.CommandText = query;
            //Correct SqlDbTypes if necessary
            cmd.Parameters.Add("@email", SqlDbType.VarChar);
            cmd.Parameters["@email"].Value = email;
            cmd.Parameters.Add("@password", SqlDbType.VarChar);
            //Should NOT be storing passwords as plain text in the database
            cmd.Parameters["@password"].Value = password;
            if (cmd.ExecuteScalar() == 1)
                return true;
        }
        catch (Exception e)
        {
             //log e somehow or eliminate this catch block
        }
        finally
        {
             //Close the connection if still open
             if (con != null && con.State != ConnectionState.Closed)
                 con.Close();
        }
    }
    return false;
}


0 commentaires

1
votes

Pour clarifier, vous avez rencontré ce problème car les variables tbxEmail et tbxPassword de votre classe User n'étaient pas les mêmes que celles de votre classe principale. Vous devez créer les deux variables à la portée de la classe:

public static void Login (string email, string password){
  // code here
}

Et ensuite:

User user = new User(tbxEmail,tbxPassword);
user.Login();

Ou, créer une méthode statique (la méthode statique ne peut pas utilisez des variables globales, donc tout ce dont vous avez besoin doit être passé en paramètre de la méthode ou créé à l'intérieur de celle-ci) .:

public class User {

  TextBox tbxEmail; // could be strings
  PasswordBox tbxPassword;

  public User (TextBox tbxEmail, TextBox tbxPassword) {
    this.tbxEmail = tbxEmail;
    this.tbxPassword = tbxPassword;
  }
}


0 commentaires