C# 打开另一个窗体后关闭windows窗体

C# 打开另一个窗体后关闭windows窗体,c#,winforms,c#-4.0,button,C#,Winforms,C# 4.0,Button,在我的应用程序中,我使用了两种表单mainform和子表单。mainForm具有简单的登录应用程序。单击main表单中的按钮(btn单击)(如果登录凭据匹配),应将其定向到子表单。这我很容易做到。但问题是,mainForm仍然可见,每当我关闭mainForm时,它也会关闭子表单。我不想发生这种事。如果我在函数之后给出this.Close(),同样的问题也会发生。 “如何在打开子窗体后关闭main窗体” 我尝试了以下代码: b单击事件: subForm newSubForm

在我的应用程序中,我使用了两种表单
mainform
子表单
mainForm
具有简单的登录应用程序。单击
main表单
中的按钮(
btn单击
)(如果登录凭据匹配),应将其定向到
子表单
。这我很容易做到。但问题是,
mainForm
仍然可见,每当我关闭
mainForm
时,它也会关闭
子表单。我不想发生这种事。如果我在函数之后给出
this.Close()
,同样的问题也会发生。
“如何在打开
子窗体后关闭
main窗体

我尝试了以下代码:

b单击事件

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

RealStestMyFrm只是一个考虑实际<代码>子窗体< /代码>的内部方法。

尝试下面的

        subForm newSubForm = new subForm();
        newSubForm.Parent = this;
        newSubForm.ShowDialog();
        this.Hide();
试试下面的方法

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

关闭主窗体后,应用程序的消息循环终止,从而导致整个应用程序退出。Windows消息循环绑定到主窗体,因为它是您启动的窗体 运行(新的mainform()

在程序中尝试其他方法

    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); 
        }
    }

关闭主窗体后,应用程序的消息循环终止,从而导致整个应用程序退出。Windows消息循环绑定到主窗体,因为它是您启动的窗体 运行(新的mainform()

在程序中尝试其他方法

    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); 
        }
    }

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

你真正想做什么?我觉得你表格的命名有点麻烦
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
,在初始化主窗体并且当前没有经过验证的用户后将调用该窗体。请注意,这只是演示代码,但可能是一种可能的实现

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;
    }
另一个想法是构建一个引导程序,在像Sathish Raja的解决方案那样加载任何表单之前,它可以管理您的
应用程序.Run()
方法

一些其他想法:

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
是应用程序可执行表单。如果关闭
main表单
,所有其他表单也将关闭

你真正想做什么?我觉得你表格的命名有点麻烦
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
,在初始化主窗体并且当前没有经过验证的用户后将调用该窗体。请注意,这只是演示代码,但可能是一种可能的实现

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;
    }
另一个想法是构建一个引导程序,在像Sathish Raja的解决方案那样加载任何表单之前,它可以管理您的
应用程序.Run()
方法

一些其他想法:

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以验证应用程序中特殊密码安全部分的用户,但第一个“版本”可以在应用程序范围内重用

感谢您的回复。为此,我可能应该在打开
子表单之前使用MessageBox,对吗?为什么在打开子表单之前需要MessageBox?而且我正在尝试在不同的条件下打开两个不同的表单。。比如如果-->
子表单
,或者如果-->
子表单1
else-->显示错误对话框。在这种情况下,我可以使用它吗?ShowDialog将以模态对话框的形式显示主窗体,在btnClick事件中,只需设置DialogResult,`private void button1\u单击(object sender,EventArgs e){if(LoginVerified){this.DialogResult=DialogResult.OK;}否则{this.DialogResult=DialogResult.Cancel;}`在mainform中设置一些属性并访问它们,以便在子表单之间切换响应。为此,我可能应该在打开
子表单之前使用MessageBox,对吗?为什么在打开子表单之前需要MessageBox?而且我正在尝试在不同的条件下打开两个不同的表单。。比如如果-->
子表单
,或者如果-->
子表单1
else-->显示错误对话框。在这种情况下,我可以使用它吗?ShowDialog将以模态对话框的形式显示主窗体,在btnClick事件中,只需设置DialogResult,`private void button1\u单击(object sender,EventArgs e){if(LoginVerified){this.DialogResult=DialogResult.OK;}否则{this.DialogResult=DialogResult.Cancel;}`在主窗体中设置一些属性并访问它们以在子窗体之间切换hide()的问题是,即使在关闭主窗体后,应用程序仍在后台运行