在我发布我的程序后,我意识到它没有正确退出,因为任务管理器中仍然存在该进程。
我调查了How do I properly close a winforms application in C#?,我发现我的Application.Run(new MainForm());
是我的登录表单。
所以我的程序就像这样运行。
登录表单后,会显示AdminForm
或UserForm
。
那么我该如何正确地完成退出程序?
//this doesnt work//
private void UserForm_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
//==============//
private void User_Load(object sender, EventArgs e)
{
some code i have..
}
更新2: 我目前正在使用Visual Studio 2012进行编辑。
我的程序以此表单开头
以管理员或用户身份登录后,他们将转发到此表单。 这是管理员表格。用户表单具有相同的模板,但是为用户禁用了不同的命名和一些按钮。
我只需要知道当我在AdminForm
或UserForm
时我如何正确退出程序。
更新3:
登录表格代码:
private void loginscs_Click(object sender, EventArgs e)
{
try
{
string userNameText = txtUser.Text;
string passwordText = txtPass.Text;
string isAdmin = "yes";
string isNotAdmin = "no";
if (!(string.IsNullOrEmpty(txtUser.Text)) && !(string.IsNullOrEmpty(txtPass.Text)))
{
SqlConnection SCScon = new SqlConnection();
SCScon.ConnectionString = "Data Source=PEWPEWDIEPIE\\SQLEXPRESS;Initial Catalog=master;Integrated Security=True";
SqlCommand cmd = new SqlCommand("SELECT ISNULL(SCSID, '') AS SCSID, ISNULL(SCSPass,'') AS SCSPass, ISNULL(isAdmin,'') AS isAdmin FROM SCSID WHERE SCSID='" + txtUser.Text + "' and SCSPass='" + txtPass.Text + "'", SCScon);
SCScon.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
this.CompareStrings(dr["isAdmin"].ToString(), isAdmin))
{
MessageBox.Show("Hello " + txtUser.Text, "Admin", MessageBoxButtons.OK, MessageBoxIcon.Information);
var adminf = new Admin(txtUser.Text);
this.Hide();
adminf.ShowDialog();
}
else if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
this.CompareStrings(dr["isAdmin"].ToString(), isNotAdmin))
{
MessageBox.Show(string.Format("Welcome {0}", txtUser.Text));
var userf = new UserForm(txtUser.Text);
this.Hide();
userf.ShowDialog();
}
}
else
{
MessageBox.Show("Wrong ID/Pass");
}
SCScon.Close();
}
这是来自Program.cs的代码(由Visual Studio创建的代码)
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Login());
}
}
答案 0 :(得分:0)
当用户关闭您的主表单时,请致电Application.Exit()
。
MSDN链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.exit(v=vs.110).aspx
此方法将WM_CLOSE消息注入所有消息队列。
将其放入FormClosing
活动中。
答案 1 :(得分:0)
你在技术上有3个论坛,而不是两个。你关闭“内部”形式,但你永远不会关闭“外部”形式。修复它的最简单方法是在显示“内部”表单的对话框后调用Close
。
if (dr.Read())
{
if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
this.CompareStrings(dr["isAdmin"].ToString(), isAdmin))
{
MessageBox.Show("Hello " + txtUser.Text, "Admin", MessageBoxButtons.OK, MessageBoxIcon.Information);
var adminf = new Admin(txtUser.Text);
this.Hide();
adminf.ShowDialog(); //This line blocks till you close the form
this.Close(); // <--- NEW LINE
}
else if (this.CompareStrings(dr["SCSID"].ToString(), txtUser.Text) &&
this.CompareStrings(dr["SCSPass"].ToString(), txtPass.Text) &&
this.CompareStrings(dr["isAdmin"].ToString(), isNotAdmin))
{
MessageBox.Show(string.Format("Welcome {0}", txtUser.Text));
var userf = new UserForm(txtUser.Text);
this.Hide();
userf.ShowDialog(); //This line blocks till you close the form
this.Close(); // <--- NEW LINE
}
}
在旁注中,您确实需要使用Parametrized Queries。如果我决定尝试在您的登录表单中使用密码'; drop table SCSID; --
,您能告诉我会发生什么吗?
您还应该在实现using
的所有对象周围使用IDisposable
语句。快速浏览SqlConnection
,SqlCommand
和SqlReader
,但可能会有更多。此外,如果您使用using
声明,则无需致电SCScon.Close();
答案 2 :(得分:0)
对于您的登录表单,请创建表单实例并调用ShowModal
方法。登录后,将Application.Run
用于用户或管理表单(基于您用于确定哪种表单的逻辑)。 Application.Run
是一个阻塞调用(该语句之后的行不会运行),直到您传入的表单被用户关闭。之后,代码将继续执行,当没有更多代码要执行时,应用程序将自然退出(无需显式调用任何内容来关闭应用程序)。