如何从Window中的另一个类调用方法?

问题描述 投票:2回答:3

所以我有一个名为“User”的类,其中我有以下方法和代码:

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

在我的LoginWindow中,我有:

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

当我尝试通过类实例化调用我的Login方法时没有任何作用,为什么呢?我称之为错误的方式吗?

c# wpf class
3个回答
1
投票

这应该有效,尽管我对应该解决的问题留下了评论。

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

1
投票

为了澄清,您遇到了这个问题,因为您的User类中的tbxEmail和tbxPassword变量与主类中的变量不同。您应该在类范围创建两个变量:

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
投票

我为我的一个学校项目写了一个基本的登录页面,类似于:

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

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.