2

在我的应用程序中,我使用了两种形式mainformsubForm. 有简单的mainForm登录应用程序。单击中的按钮 ( btnClick) mainForm(如果登录凭据匹配),它应该被定向到subForm. 这我可以轻松做到。但问题是mainForm仍然可见,每当我关闭mainForm它时,它也会关闭subForm. 我不想发生这种情况。如果我this.Close()在功能发生后给出同样的问题。“打开后
如何关闭。”mainFormsubForm

我试过下面的代码:

btnClick 事件

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

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

4

3 回答 3

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); 
        }
    }
于 2012-10-04T11:49:55.817 回答
1

尝试以下

        subForm newSubForm = new subForm();
        newSubForm.Parent = this;
        newSubForm.ShowDialog();
        this.Hide();
于 2012-10-04T11:46:09.703 回答
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 以验证应用程序的特殊密码保护部分的用户,但是第一个“版本”可以在应用程序范围内重用。
于 2012-10-04T18:58:58.037 回答