正确退出程序

时间:2013-12-31 12:42:45

标签: c# winforms

在我发布我的程序后,我意识到它没有正确退出,因为任务管理器中仍然存在该进程。

我调查了How do I properly close a winforms application in C#?,我发现我的Application.Run(new MainForm());是我的登录表单。

所以我的程序就像这样运行。

登录表单后,会显示AdminFormUserForm

那么我该如何正确地完成退出程序?

更新

//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进行编辑。

我的程序以此表单开头 SMECS

以管理员或用户身份登录后,他们将转发到此表单。 这是管理员表格。用户表单具有相同的模板,但是为用户禁用了不同的命名和一些按钮。 ASmecs

我只需要知道当我在AdminFormUserForm时我如何正确退出程序。

更新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());
        }
    }

3 个答案:

答案 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语句。快速浏览SqlConnectionSqlCommandSqlReader,但可能会有更多。此外,如果您使用using声明,则无需致电SCScon.Close();

答案 2 :(得分:0)

对于您的登录表单,请创建表单实例并调用ShowModal方法。登录后,将Application.Run用于用户或管理表单(基于您用于确定哪种表单的逻辑)。 Application.Run是一个阻塞调用(该语句之后的行不会运行),直到您传入的表单被用户关闭。之后,代码将继续执行,当没有更多代码要执行时,应用程序将自然退出(无需显式调用任何内容来关闭应用程序)。