1

经过 6 个小时的分析和遵循这个POST解决方案,我的登录表单 frmLog 仍然不会关闭。我在 Microsoft Visual Studio C# 窗口窗体应用程序中创建了两个窗体。我的问题是即使我使用不同的方法并尝试了登录表单不会关闭或隐藏的所有内容。这很烦人,让我在这个问题上花费了很多时间。请帮我。

这是我在 Program.cs 中初始化启动表单的代码。

 public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            frmLog fLogin = new frmLog();
            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new frmMain());
            }
            else
            {
                Application.Exit();
            }
        }

这是我的登录表单代码,frmMain如果用户和密码为真,则显示主表单,它们实际上已连接到数据库。

 private void btnSubmit_Click(object sender, EventArgs e)
        {

                Mylibrary a = new Mylibrary("localhost", "root", "", "cashieringdb");
                string user = txtLogin.Text;
                string pass = txtPassword.Text;
                string query = "SELECT * FROM register WHERE username='" + user + "' AND password=MD5('" + pass + "')";
                int result = a.Count(query);
                if (result == 1)
                {
                    LOGIN_USER = txtLogin.Text;
                    frmMain main = new frmMain();
                    main.Show();
                    this.close
                }
                else
                {
                    MessageBox.Show("Login Failed! Try Again");
                    txtLogin.Text = "";
                    txtPassword.Text = "";
                }

        }

请帮我解决这个问题。

4

7 回答 7

1

用这个

  static void Main()


{
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmLog ());

    }

在frmlog里面

利用

this.hide();
new frmMain().ShowDialog();
于 2013-04-15T10:10:33.987 回答
0

loginform login = new loginfrom(); login.Hide();

请尝试以这种方式隐藏您的登录表单。

于 2013-04-15T10:08:01.600 回答
0

您的登录表单不应该负责显示主表单,这已经在您的Main方法中稍后处理!相反,您应该做的是返回 DialogResult,因为稍后您将检查它的值。

我宁愿不评论您的代码,因为这是架构自杀。将各种层混合成一个丑陋的烂摊子,呸。

.Hide()建议作为解决方案的公认答案是BAD。Hide() 相当于说.Visible=false,这在您的场景中没有意义。它仍然存在于背景中。

于 2013-04-15T10:09:13.543 回答
0

很多 Q/A 建议你正确地开始了。
从作为模态Main()调用LoginForm,如果结果正常LoginForm,则自动关闭并且 MainForm 由ApplicationRun(MainForm).

但是,您已经MainFormLoginForm.

if (result == 1)
{
  LOGIN_USER = txtLogin.Text;
  frmMain main = new frmMain();
  main.Show();
  this.close
}

所以改变它:

if (result == 1)
{
  LOGIN_USER = txtLogin.Text;
  //Logged in
  // return DialogResult.OK as it needed for Program.cs to allow load MainForm
  this.DialogResult = DialogResult.OK;
}

模态对话框- “......它后面的代码直到对话框关闭后才会执行......”

于 2013-10-20T08:38:58.527 回答
0

修改Main()为默认:

 static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmLog ());
    }

使用this.Hide();而不是this.Close();,试试这个:

private void btnSubmit_Click(object sender, EventArgs e)
    {
            Mylibrary a = new Mylibrary("localhost", "root", "", "cashieringdb");
            string user = txtLogin.Text;
            string pass = txtPassword.Text;
            string query = "SELECT * FROM register WHERE username='" + user + "' AND password=MD5('" + pass + "')";
            int result = a.Count(query);
            if (result == 1)
            {
                LOGIN_USER = txtLogin.Text;
                frmMain main = new frmMain();
                main.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Login Failed! Try Again");
                txtLogin.Text = "";
                txtPassword.Text = "";
            }

    }
于 2013-04-15T10:10:52.457 回答
0

您的登录表单应该是一个单独的表单,您应该将其显示为主表单中的对话框。您的代码可能如下所示:

private void btnSubmit_Click(object sender, EventArgs e)
{
    bool loginSuccessful = false;
    var frmLogin = new FormLogin();
    while (frmLogin.ShowDialog() == DialogResult.OK)
    {
        // verify login details
        Mylibrary a = new Mylibrary("localhost", "root", "", "cashieringdb");
        string user = frmLogin.txtLogin.Text;
        string pass = frmLogin.txtPassword.Text;
        string query = "SELECT * FROM register WHERE username='" + user + "' AND password=MD5('" + pass + "')";
        int result = a.Count(query);
        if (result != 1)
        {
            MessageBox.Show("Login failed, try again", "Login");
        }
        else
        {
            loginSuccessful = true;
            break;
        }
    }

    if (!loginSuccessful)
    {
        // user cancelled - close main window to end application
        this.Close();
    }
}
于 2013-04-15T10:29:06.627 回答
0

显示下一个窗口时不需要隐藏第一个窗口。只需在 Program.cs 文件中 Program 类的 Main 方法中执行以下步骤:

static void Main()
{
        if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
        {
            return;
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MyFirstWindow fw = null;
        do
        {
            fw = new MyFirstWindow();
            Application.Run(fw);
        } while (!fw.checked);

        Application.Run(new MyNextWindow());
    }

正如您在 MyFirstWindow 类中看到的那样,您拥有 isChecked 属性,该属性类型为布尔值,默认值为 false。因此,您可以进行一些检查(例如登录),更改选中属性的值并关闭第一个窗口。在选中的属性不为真之前,您的下一个窗口将不会运行

于 2016-04-07T08:21:42.607 回答