我是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声明为其他类?
答案 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();
}
}