2017-06-08 2 views
1

私は2つのフォーム、LoginForm1を持っています。私はLoginフォーム上btnLogin_Clickをクリックすると、それはこのコードでForm1を開きます2つのフォームをwinformで非表示/表示

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    Form1 pu = new Form1(label2.Text); 
    pu.Show(); 
    pu.FormClosing += Pu_FormClosing; 
    Hide(); 
} 

private void Pu_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    this.Show();    
} 

そして、私はForm1btnExit_Clickをクリックしたとき、それはフォームを閉じ、このコードを使用してLoginフォームを開きます。

private void btnExit_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

は今、私が欲しいものを私はbtnExitそれ非表示Form1をクリックして、Loginフォームを開き、方法を見つけることである、と私はにログインボタンをクリックしたときフォームは、新しいインスタンスを作成する代わりにForm1を表示します。あなたはApplication.OpenForms経由に(隠された)インスタンスを見つける必要があり

+0

ここで問題がありますか?なぜそれを働かせることができないのですか? –

+1

1つのフォームが必要な場合は、新しいインスタンスを毎回作成するのではなく、アプリケーションの開始を控えるように作成します。 – Vladimir

+0

'Application.OpenForms'コレクションを繰り返して、すでに作成されているメインフォームを見つけてください。 – Pikoh

答えて

1

一つの方法は、Form1インスタンスのクラスレベルの変数を作成することですpuインスタンスはnullではありません(ユーザーがフォームを非表示にするボタンをクリックするのではなく、フォームを閉じる場合など)、puフォームインスタンスを表示します。

インスタンスがnullの場合、新しいインスタンスが作成され、イベントハンドラがフックアップされます。 VisibleChangedFormClosingの両方のイベントを、ログインフォームを表示するメソッドに接続します。代わりに、フォームをFormClosingイベントでは、我々は実際に近くをキャンセルしていることに注意して隠す:

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     Hide(); 

     if (pu == null) 
     { 
      pu = new Form1(label2.Text); 
      pu.VisibleChanged += Pu_VisibleChanged; 
      pu.FormClosing += Pu_FormClosing; 
     } 

     pu.Show(); 
    } 

    private void Pu_VisibleChanged(object sender, EventArgs e) 
    { 
     // Only show the login form if the form1 is NOT visible 
     if (!pu.Visible) Show(); 
    } 

    private void Pu_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Set cancel to true to prevent the form from closing, then hide the form instead 
     e.Cancel = true; 
     pu.Hide(); 
     this.Show(); 
    } 
} 

次にあなたがする必要があるだけで、他の変更は、それを閉じるのではなく、Form1のボタンHideフォームを作ることです。

public partial class Form1 : Form 
{ 
    private void btnExit_Click(object sender, EventArgs e) 
    { 
     Hide(); 
    } 

    // rest of class code omitted... 
} 
3

OpenFormsプロパティはアプリケーションが所有するフォーム の読み取り専用のコレクションを表します。このコレクションは、インデックス ポジションまたはフォームの名前で検索できます。

public partial class Login : Form 
{ 
    private Form1 pu; 

    // code continued below... 

し、ボタンのクリックイベントに、我々はログインフォームを非表示になります、次のことを確認します。これを処理する

using System.Linq; 

... 

Form1 form = Application 
    .OpenForms 
    .OfType<Form1>() 
    .LastOrDefault(); // if we have several Form1 instances, let's take the last one 

if (from == null) // no Form1 instance found, have to create one 
    form = new Form1(); 

form.Show(); 
+0

私はちょうどあなたと同じようにコメントしましたが...今私は確信していません、' OpenForms'には隠されたフォームも含まれていますか? – Pikoh

+0

@Pikoh:* 'OpenForms'のOpen *はちょっと誤解を招いています:*所有*、*作成されたハンドル*と同様に読むべきです。可視状態(表示/非表示)は 'OpenForms'には影響しません –

+0

はい、それは私の考えです。しかし、私は、OpenFormsから隠されたフォームが消えてしまうバグについて覚えていると思います。だから、私はあなたに尋ねました – Pikoh

関連する問題