为什么在执行此代码时,名为(Smart_pharmacy)的表单将被关闭:
private void LoginBTN_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=Abdullah-PC;Initial Catalog=SmartPharmacyDB;Integrated Security=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = "select userpass from usertab where username = @username";
com.Parameters.Add("@username", usernametxt.Text);
con.Open();
object returnedvalue = com.ExecuteScalar();
if (returnedvalue != null)
{
string returneduserpass = com.ExecuteScalar().ToString();
con.Close();
if (returneduserpass == userpasstxt.Text)
{
Smart_Pharmacy f = new Smart_Pharmacy();
f.Show();
this.Close();
}
else
{
MessageBox.Show("Incorrect username or password !");
}
}
else
{
MessageBox.Show("Incorrect username or password !");
}
}
我希望关闭当前表单并保持表单(Smart_Pharmacy)打开请帮助。
答案 0 :(得分:4)
我假设您的主表单中包含此代码(在Main
方法中传递给Application.Run方法的代码)。当主申请表关闭时,所有其他表格也将关闭,申请终止。
您应该做的是将应用程序主窗体更改为Smart_Pharmacy
。如果登录失败,请关闭申请。像这样:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using(LoginForm loginForm = new LoginForm())
{
if (loginForm.ShowDialog() != DialogResult.OK)
return; // exit applicatioin if login failed
}
// if login successfully this start main form
Application.Run(new Smart_Pharmacy());
}
答案 1 :(得分:1)
我想说的是因为你在表单中创建了Smart_Pharmacy表单然后关闭(即销毁)。
所以代码会按照你所说的去做...杀死当前的表单。由于表单被破坏,所有仅在此表单中引用的对象也会被销毁。
如果您希望其他表单保持打开状态,则必须在其他位置保留对其的引用。
PS:在一个不相关的说明中,这段代码太可怕了。你真的不应该从按钮点击等连接到数据库。如果您有能力对此进行修改,我强烈建议您将业务逻辑与UI代码分开。从技术上讲,这是有效的,但你应该总是尝试保持分层并易于维护。
答案 2 :(得分:0)
更改为
Smart_Pharmacy f = new Smart_Pharmacy();
f.ShowDialog(this);
this.Close();
所以this.Close()
将在Smart_Pharmacy
表单关闭后执行
如果您需要隐藏主要表单,请在打开this.WindowState = FormWindowState.Minimized;
Smart_Pharmacy
答案 3 :(得分:0)
我遇到了同样的问题。我猜您的登录表单已设置为您的启动表单。在这种情况下,您需要隐藏它而不是关闭它。