2

私のアプリケーションでは、2つのフォームmainformとを使用していsubFormます。mainFormシンプルなログインアプリケーションがあります。(ログイン資格情報が一致する場合)のボタン(btnClick)をクリックすると、に移動します。これは簡単にできます。しかし、問題はまだ表示されており、閉じるたびにも閉じていることです。私は起こりたくない。関数の後に与えると、同じ問題が発生します。「開封後の 閉め方」mainFormsubFormmainFormmainFormsubFormthis.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、メインフォームが初期化され、現在確認済みのユーザーがいない後に呼び出されます。これは単なるデモコードですが、1つの可能な実装である可能性があることに注意してください。

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

もう1つのアイデアは、Application.Run()Sathish Raja Sソリューションのように、フォームが読み込まれる前にメソッドを管理するブートストラッパーを構築することです。

いくつかの追加の考え:

  • ユーザー名/パスワードのテキストボックスに資格情報が入力される前に、ユーザーがログインボタンをクリックしないようにします。
  • これをより柔軟に構築し、LoginFormを拡張して、アプリケーションの特別なパスワードで保護されたセクションのユーザーを確認できますが、この最初の「バージョン」はアプリケーション全体で再利用できます。
于 2012-10-04T18:58:58.037 に答える