【问题标题】:Wrong form is being closed [closed]错误的表格正在关闭[关闭]
【发布时间】:2013-12-28 05:33:33
【问题描述】:

为什么当我执行此代码时名为 (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) 处于打开状态,请帮助。

【问题讨论】:

标签: c# winforms


【解决方案1】:

我假设您的主表单中有此代码(在您的 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());
}

【讨论】:

  • @downvoter 你能解释一下我哪里出错了吗?
  • 您对问题的诊断很好;您提出的解决方案是一个坏主意。他完成了表格;他不应该在申请期间将其隐藏起来。解决方案是简单地更改主窗体是什么。
  • @Servy 我认为 OP 稍后将需要当前表格。但在再次阅读问题后,我发现这看起来像登录表单,Smart_Pharmacy 是一个主要表单。所以,同意你的观点,隐藏对登录表单不好
【解决方案2】:

我会这样说是因为您在表单中创建了 Smart_Pharmacy 表单,然后关闭(即销毁)。

所以代码会按照您的要求执行...杀死当前表单。由于表单已销毁,因此仅在此表单中引用的所有对象也将被销毁。

如果您希望其他表单保持打开状态,那么您必须在其他地方保留对它的引用。

PS:在不相关的注释中,这段代码很糟糕。你真的不应该通过按钮点击等连接到数据库。如果您有能力对此进行修改,我强烈建议您将业务逻辑与 UI 代码分开。

从技术上讲,这是可行的,但您应该始终尝试保持分层和易于维护。

【讨论】:

  • 不正确。显示的表单将被添加到应用程序打开的表单中,并在您关闭创建它的其他(非主)表单时保留在那里
  • 嗯。我承认我已经很久没有在 winforms 中做过任何事情了,所以我同意你的看法:) 但是,如果登录表单是主要表单,我的答案仍然有效……尽管略有污点。
【解决方案3】:

我也遇到了同样的问题。我猜您的登录表单被设置为您的启动表单。在这种情况下,您需要隐藏它而不是关闭它。

【讨论】:

  • 是的,它被设置为启动表单。
  • 正如@lazyberezovsky 所说,我会简单地隐藏表单而不是关闭它。 this.Hide(); 只需确保在关闭应用程序时记得您的登录表单仍处于“打开”状态并处于隐藏状态。
【解决方案4】:

改成

 Smart_Pharmacy f = new Smart_Pharmacy();
 f.ShowDialog(this);
 this.Close();

所以this.Close() 将在Smart_Pharmacy 表单关闭后执行

如果您需要隐藏主窗体,请在打开Smart_Pharmacy之前使用this.WindowState = FormWindowState.Minimized;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多