打开另一个表单后关闭一个窗体

时间:2012-10-04 11:39:34

标签: c# winforms c#-4.0 button

在我的申请中,我使用了两种表单mainformsubFormmainForm具有简单的登录应用程序。单击btnClick中的按钮(mainForm)(如果登录凭据匹配),它应该定向到subForm。我可以轻松做到这一点。但问题是mainForm仍然可见,每当我关闭mainForm时,它也会关闭subForm。我不想发生这种事。如果我在功能发生后发出this.Close() {。}} “打开mainForm后如何关闭subForm

我尝试过以下代码:

btnClick活动

            subForm newSubForm = new subForm();
            newSubForm.Show();
            newSubForm.RegisterMainForm(this);
            this.Close();

RegisterMainForm只是一个考虑实际subForm的内部方法。

3 个答案:

答案 0 :(得分:2)

关闭主窗体后,应用程序的消息循环终止,导致整个应用程序退出。 Windows消息循环与您的主窗体绑定,因为这是您启动的那个 Application.Run(new mainform())。

在Program.cs中尝试其他方法

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainForm mf  = new MainForm();
        if (mf.ShowDialog() == DialogResult.OK) 
        {  
           subForm newSubForm = new subForm();   
           newSubForm.RegisterMainForm(this);                        
           Application.Run(newSubForm); 
        }
    }

答案 1 :(得分:1)

尝试以下

        subForm newSubForm = new subForm();
        newSubForm.Parent = this;
        newSubForm.ShowDialog();
        this.Hide();

答案 2 :(得分:1)

我不知道您为什么要关闭mainForm。在这种情况下,mainForm是应用程序可执行表单。如果您关闭mainForm,则所有其他表单也将关闭。

你真的想做什么?我认为你的表单的命名有点令人烦恼。 mainForm对我来说意味着你的申请的主要部分将以这种形式执行,是吗?

为什么不构建在应用程序启动后显示的LoginForm并且用户当前未经过验证?我认为这不应该避免你的目的,而是一个干净的解决方案。

一些代码示例:

public partial class MainForm : Form
{
    private bool isVerified = false;

    public MainForm()
    {
        InitializeComponent();
        InitializeLogin();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {

    }

    private void InitializeLogin()
    {
        if (!isVerified)
        {
            using (LoginForm login = new LoginForm())
            {
                if (login.ShowDialog() == DialogResult.OK)
                {
                    MessageBox.Show("Login successful!");
                    isVerified = true;
                }
            }
        }
        else
        { }
    }

这是LoginForm,将在Mainform初始化之后调用,并且当前没有经过验证的用户。请注意,这只是演示代码,但可能是一种可能的实现。

public partial class LoginForm : Form
{

    public LoginForm()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (IsUser())
        {
            // the DialogResult of the Form must be set 
            this.DialogResult = System.Windows.Forms.DialogResult.OK;    
        }
    }

    private bool IsUser()
    {
        return true;
    }

另一个想法是构建一个在加载任何表单之前管理Application.Run()方法的引导程序,如Sathish Raja S解决方案。

一些额外的想法:

  • 避免用户在用户名/密码文本框填充凭据之前单击“登录”按钮。
  • 您可以更灵活地构建它,并扩展LoginForm以验证用户是否为您的应用程序的特殊密码安全部分,但第一个“版本”可以在应用程序范围内重用。