Как вызвать метод из другого класса внутри окна? - PullRequest
0 голосов
/ 22 февраля 2019

Итак, у меня есть класс с именем «Пользователь», в котором у меня есть следующий метод и код:

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";
      }
   }
}

И в моем окне входа в систему у меня есть:

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

Когда я пытаюсьчтобы вызвать мой метод Login через экземпляр класса, ничего не работает, почему это так?Я называю это неправильно?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Это должно сработать, хотя я оставил комментарии к вещам, которые должны быть рассмотрены.

User класс:

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;
}

LoginWindow класс:

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";
    }
}
0 голосов
/ 22 февраля 2019

Для пояснения, у вас возникла эта проблема, потому что переменные tbxEmail и tbxPassword в вашем классе User не совпадают с переменными в вашем основном классе.Вы должны создать обе переменные в области видимости класса:

public class User {

  TextBox tbxEmail; // could be strings
  PasswordBox tbxPassword;

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

А затем:

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

Или создать статический метод (статический метод не может использовать глобальные переменные, поэтому все, что вам нужно)должны быть переданы как параметр метода или созданы внутри него).:

public static void Login (string email, string password){
  // code here
}
0 голосов
/ 22 февраля 2019

Я написал элементарную страницу входа в один из моих школьных проектов, подобный этому:

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;
        }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...