我正在使用使用登录窗口的Windows窗体应用程序,并根据所选的用户名将您重定向到属于该用户名的表单。在登录窗口中,用户从ComboBox
中选择其帐户名,然后在文本框中键入正确的密码。如果输入了错误的密码,则用户将收到警告MessageBox
。问题是我为此登录使用if
和else
语句的过程完全混乱。
我的问题:如果我正确登录其中一个帐户,则会打开新表格,但是其他MessageBoxes
条错误为else
的其他MessageBoxs
条仍会显示在新表格。我该如何设计不同。注意:Guest
用户不需要密码。
我的代码:
private void button1_Click(object sender, EventArgs e)
{
string selectedUser = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);
if (selectedUser == "Guest")
{
Form3 form5 = new Form3();
form5.Show();
form5.Activate();
this.Hide();
}
if ((selectedUser == "Admin") && (textBox1.Text== "password"))
{
Form1 form3 = new Form1();
form3.Show();
form3.Activate();
this.Hide();
}
else MessageBox.Show("Password is incorrect!", "ERROR!");
if ((selectedUser == "Limited") && (textBox1.Text== "limited"))
{
Form2 form4 = new Form2();
form4.Show();
form4.Activate();
this.Hide();
}
else MessageBox.Show("Password is incorrect!", "ERROR!")
}
答案 0 :(得分:1)
我通常会使用Dictionary
:
Dictionary<string, Form> dictionary = new Dictionary<string, Form>()
{
{"Guest", new Form3()},
{"Admin", textBox1.Text == @"password" ? new Form1() : null},
{"Limited", textBox1.Text == @"limited" ? new Form2() : null}
};
Form value;
dictionary.TryGetValue(selectedUser, out value);
if (value != null)
{
value.Show();
value.Activate();
this.Hide();
}
答案 1 :(得分:1)
private void button1_Click(object sender, EventArgs e)
{
string selectedUser = this.comboBox1.GetItemText (this.comboBox1.SelectedItem);
if (selectedUser == "Guest")
{
Form3 form5 = new Form3();
form5.Show();
form5.Activate();
this.Hide();
}
else if ((selectedUser == "Admin") && (textBox1.Text == "password"))
{
Form1 form3 = new Form1();
form3.Show();
form3.Activate();
this.Hide();
}
else if ((selectedUser == "Limited") && (textBox1.Text == "limited"))
{
Form2 form4 = new Form2();
form4.Show();
form4.Activate();
this.Hide();
}
else{
MessageBox.Show("Password is incorrect!", "ERROR!");
}
}
答案 2 :(得分:1)
一种解决方案是在每个if分支之后立即返回:
if (selectedUser == "Guest")
{
Form3 form5 = new Form3();
form5.Show();
form5.Activate();
this.Hide();
return;
}
if ((selectedUser == "Admin") && (textBox1.Text == "password"))
{
Form1 form3 = new Form1();
form3.Show();
form3.Activate();
this.Hide();
return;
}
if ((selectedUser == "Limited") && (textBox1.Text == "limited"))
{
Form2 form4 = new Form2();
form4.Show();
form4.Activate();
this.Hide();
return;
}
如果不同用户的表单非常相似。您可以考虑从通用基类继承它们,以减少代码重复。
// "return" will cause this method to stop running immediately, so this
// statement will only be run if none of the ifs gets run.
MessageBox.Show("Password is incorrect!", "ERROR!");
答案 3 :(得分:0)
代码的问题是,您到处散布了IF语句。您应该将它们全部合并为一个。
string selectedUser = this.comboBox1.GetItemText(this.comboBox1.SelectedItem);
if (selectedUser == "Guest"){
Form3 form5 = new Form3();
form5.Show();
form5.Activate();
this.Hide();
} else if ((selectedUser == "Admin") && (textBox1.Text == "password")){
Form1 form3 = new Form1();
form3.Show();
form3.Activate();
this.Hide();
} else if ((selectedUser == "Limited") && (textBox1.Text == "limited")) {
Form2 form4 = new Form2();
form4.Show();
form4.Activate();
this.Hide();
} else {
MessageBox.Show("Password is incorrect!", "ERROR!");
}
答案 4 :(得分:0)
首先,我建议您为多次执行的事情编写一种方法。
考虑到这一点,我认为在您的情况下,使用switch语句可能是一个不错的选择:
switch(selectedUser)
{
case "Guest": return ShowForm(new Form3());
case "Admin":
if(textBox1.Text == "password")
{
ShowForm(new Form1());
}
else
{
MessageBox.Show("Password is incorrect!", "ERROR!");
}
return;
case "Limited":
if(textBox1.Text == "limited")
{
ShowForm(new Form2());
}
else
{
MessageBox.Show("Password is incorrect!", "ERROR!");
}
return;
default: return;
}
然后使用您的ShowForm()方法:
private void ShowForm(Form FormToShow)
{
FormToShow.Show();
FormToShow.Activate();
this.Hide();
}
答案 5 :(得分:0)
不要害怕将逻辑提取到更小和更简单的函数中。这确实可以帮助管理复杂性。
例如,您可以编写一个简单的函数来验证凭据。...
Observable
还有一个简单的函数可以选择正确的形式:
bool IsPasswordCorrect(string userName, string password)
{
if (userName == "Guest") return true;
if (userName == "Limited" && password == "limited") return true;
if (userName == "Admin" && password == "admin") return true;
return false;
}
现在剩下的很简单了:
Form CreateFormForUser(string userName)
{
if (userName == "Admin") return new Form1();
if (userName == "Limited") return new Form2();
return new Form3();
}
当然,有更多聪明的方法来编写此代码(例如,使用工厂,使用字典等),但是在我看来,更重要的概念是将复杂的问题分解为更简单的问题。处理琐碎的软件问题以外的其他事情时,精通这种思维方式至关重要。
答案 6 :(得分:0)
您的方法很混乱,因为您试图一次做太多事情。
有关各方的担忧;创建一个验证用户的方法,创建另一个向用户显示正确形式的方法。在这种情况下,我将使用字典(或地图),因为它们非常方便(为清楚起见,我将它们更新为本地语言)。
用户验证:
bool AuthorizeUser(string userName, string password)
{
var users = new Dictionary<string, string>()
{
{"GUEST", null},
{"ADMIN", "admin"},
{"LIMITED", "limited"}
};
var upperInvariantUserName = userName.ToUpperInvariant();
if (users.TryGetValue(upperInvariantUserName,
out var storedPassword))
{
if (storedPassword == null ||
password == storedPassword)
return true;
}
return false;
}
现在显示适当的形式:
void ShowForm(string userName, string password)
{
var formSelectors = new Dictionary<string, Func<Form>>()
{
{"GUEST", () => new Form3()},
{"ADMIN", () => new Form1()},
{"LIMITED", () => new Form2()}
};
if (AuthorizeUser(userName, password))
{
if (formSelectors.TryGetValue(
user,
out var formCreator))
{
var form = formCreator();
form.Show();
this.Hide();
form.Activate();
}
else
{
//user not supported!
throw new NotImplementedException(
"This user is currently not supported.");
}
}
else
MessageBox.Show("Unknown or unauthorised user.");
}
始终牢记黄金法则:没有一项任务足够小,不值得采用自己的方法。将所有事情分解成愚蠢的小任务;很难弄错他们。