如何声明其他类别的文​​本框?

时间:2020-02-13 07:01:38

标签: c#

我是C#的新手。我有一个System_Functions.cs文件,其中包含Register_Receptionist()方法。在此内部,他们与数据库连接并将信息插入数据库。该方法内部有验证来检查用户名是否已被使用:

public bool Register_Receptionist(string fName, string mName, string lName, string pass, string passVerify)
    {
        TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

        // Verify if all fields are filled
        if (fName == "" || mName == "" || lName == "" || pass == "" || passVerify == "") {
            MessageBox.Show("Please fill up all fields");
            return false;
        } else {
            // Verify if passwords match
            if (pass != passVerify) {
                MessageBox.Show("Passwords do not match");
                return false;
            } else {
                string fNameU = Regex.Replace(fName, @"\s+", "");
                string lNameU = Regex.Replace(lName, @"\s+", "");
                string username = fNameU.ToLower() + "." + lNameU.ToLower();

                using (var con = new SqlConnection(Form1.conString))
                using (var checkDupQuery = new SqlCommand("SELECT count(*) FROM tbl_users WHERE username =@username", con)) {
                    checkDupQuery.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
                    con.Open();
                    int checkCount;
                    checkCount = (int)checkDupQuery.ExecuteScalar();
                    con.Close();
                    if (checkCount != 0) {
                        MessageBox.Show("User is already registered.");
                        return false;
                    } else {
                        //using (var con = new SqlConnection(Form1.conString))
                        using (var query = new SqlCommand("INSERT INTO tbl_users (fname, mname, lname, username, pass, salt) VALUES (@fname, @mname, @lname, @username, @pass, @salt)", con)) {
                            // Name Block
                            query.Parameters.Add("@fname", SqlDbType.VarChar).Value = textInfo.ToTitleCase(fName.ToLower());
                            query.Parameters.Add("@mname", SqlDbType.VarChar).Value = textInfo.ToTitleCase(mName.ToLower());
                            query.Parameters.Add("@lname", SqlDbType.VarChar).Value = textInfo.ToTitleCase(lName.ToLower());

                            // Username
                            query.Parameters.Add("@username", SqlDbType.VarChar).Value = username;

                            // Password
                            // Generate Salt
                            int saltLength = pass.Length;
                            var saltGen = Create_Salt(saltLength);
                            var hashedPass = GenerateHash(pass, saltGen);

                            // Insert hashed password and salt to database
                            query.Parameters.Add("@pass", SqlDbType.VarChar).Value = hashedPass;
                            query.Parameters.Add("@salt", SqlDbType.VarChar).Value = saltGen;
                            con.Open();
                            int check = query.ExecuteNonQuery();
                            con.Close();

                            if (check == 0) {
                                MessageBox.Show("Error. Please try again later.");
                                return false;
                            }
                        }

                    }
                }
            }
        }
        return true;
    }

我有一个包含Windows窗体的Register.cs,还从System_Function.cs文件中调用了Register_Receptionist()方法:

private void btnRegister_Click(object sender, EventArgs e)
{
    string fName = txtFname.Text;
    string mName = txtMname.Text;
    string lName = txtLname.Text;
    string pass = txtPassword.Text;
    string passVerify = txtPasswordVerify.Text;

    System_Functions register = new System_Functions();
    var regCheck = register.Register_Receptionist(fName, mName, lName, pass, passVerify);
    if (regCheck == true) {
        MessageBox.Show("Successfully registered.");
        this.Hide();
        login.Show();
    }

}

我想做的是在发现用户名已被占用时清除Register.cs中的文本框。但是,我在使用txtFname.Clear()清除它时遇到了麻烦,因为它返回一个错误,指出当前上下文中不存在该错误。如何将文本框从Register.cs声明为其他类?

1 个答案:

答案 0 :(得分:0)

我建议在属于txtFname.Clear()中呼叫Form。 让我们提取验证

private bool IsRegistrationDataValid() {
  if (string.IsNullOrWhiteSpace(txtFname.Text)) {
      if (txtFname.CanFocus) 
        txtFname.Focus();

      MessageBox("Please, fill in first name."); 

      return false;
  }
  //TODO: Add more cases here

  return true; 
}

注册

private bool TryRegister() {
  if (!IsRegistrationDataValid()) 
    return false;

  System_Functions register = new System_Functions();

  return (register.Register_Receptionist(txtFname.Text, 
                                         txtMname.Text, 
                                         txtLname.Text, 
                                         txtPassword.Text, 
                                         txtPasswordVerify.Text));
}

然后使用它们

private void btnRegister_Click(object sender, EventArgs e) {
  if (!IsRegistrationDataValid())
    return;
  else if (TryRegister()) {
    MessageBox.Show("Successfully registered.");
    Hide();
    login.Show(); 
  }
  else {
    MessageBox.Show($"Sorry, \"{txtFname.Text}\" has been taken. Put another one.");

    txtFname.Clear();

    // Let's be nice and put keyboard focus on the textbox we ask to change
    if (txtFname.CanFocus) 
      txtFname.Focus();
  } 
}
相关问题