2009-08-27 19 views
1

Windowsフォームアプリケーション(C#)に奇妙な問題があります。私はNotifyIconとフォーム(Form1)と別のフォーム(Form2)をプロジェクトに持っています。 Form1には基本的にXML解析が行われ、一連のLinkLabelsがForm2に追加されるコードがいくつかあります。これはすべて正常に動作します。Windowsフォーム:閉じていますが閉じていません。

NotifyIconでは、基本的には、コマンドでXML解析を実行するために、EventHandlerを使用してContextMenu MenuItem(「リフレッシュ」と呼ばれる)を持っています。 NotifyIconには、システムトレイアイコンをダブルクリックすると、Form2(ShowDialog()を使用)を開いてLinkLabelsのリンクを表示するMouseDoubleClickコマンドもあります。これも正常に動作します。 Form2のを閉鎖する

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

私はForm2の( "閉じる" と呼ばれる)上のボタンコントロールを持っている。これは、このイベントハンドラのコードを使用しています。これも正常に動作します。

ただし、Form1のNotifyIconの「更新」ContextMenu MenuItemがヒットした回数に応じて、これはForm2を閉じる前にForm2の「閉じる」ボタンコントロールを押す必要があります。たとえば、ユーザーがForm1で「Refresh」MenuItemを3回押すと、Form2の「閉じる」ボタンコントロールを3回押す必要があります。これはForm2が目に見えて閉じるようなものですが、コードは閉じていることを認識していないようです。

私はWindowsフォームの開発には新しく、多分それは私が気づいていないライフサイクルのものです。どんな助けもありがとう。

EDIT。フォーム2(メッセージ)で

//NotifyIcon Form (Form1) 
//ico is the ID of the NotifyIcon 
public partial class TrayIcon : Form 
{ 
    Message msg = new Message(); //Form2 
    ContextMenu contextMenu = new ContextMenu(); 

    public TrayIcon() 
    { 
     InitializeComponent(); 
    } 

    private void TrayIcon_Load(object sender, EventArgs e) 
    { 
     contextMenu.MenuItems.Clear(); 
     contextMenu.MenuItems.Add(0, new MenuItem("Refresh", new System.EventHandler(ico_Refresh))); 

     ico.DoubleClick += new MouseEventHandler(ico_ShowMsg); 

     DoXmlParsing(); 
    } 

    private void ico_Refresh(object Sender, EventArgs e) 
    { 
     TrayIcon_Load(null, null); 
    } 

    private void ico_ShowMsg(object Sender, MouseEventHandler e) 
    { 
     if (msg.Visible == false) 
      msg.ShowDialog(); 
    } 
} 

私はこれをクリックハンドラのコードとボタンがあります:

あなたの説明から、
private void btnClose_Click(object sender, EventArgs e) 
{ 
    this.Close(); 

    //I have also tried: 
    if (this.Visible) 
     this.Hide(); 
} 
+0

Refresh MenuItemのコードとForm2を開くコードを投稿できますか? –

+0

Fo rm2はモードレスなフォームですか?また、btnClose_Clickの中にブレークポイントを置いて、毎回呼び出されていることを確認してください。 –

答えて

9

ico.DoubleClick += new MouseEventHandler(ico_ShowMsg); 

あなたはTrayIcon_Loadico_Refreshに呼び出されるため(ダブルクリックに複数のイベントハンドラを追加し、それらを削除することはありませんあなたは閉じ

後保ちます。ダイアログボックスで.ShowDialog()が再度呼び出されますが、このイベントハンドラが何度も追加されています

+0

これは恥ずかしがり屋ではありません。私が戻って質問を(コード編集後に)もう一度読んだとき、私はそれを見つけなかった。よかった! –

2

あなたの更新のMenuItemが起動しているようですが、私は適切なコードを投稿してみましょう以前のフォームよりもフォーム2の新しいインスタンス。

Refreshメニューの背後にコードを表示できますか?

+0

上に掲載されたコードを参照 –

2

あなたが各1を閉鎖しなければならないので、私はあなたがNotifyIcon MouseDoubleClickイベントハンドラのコードを投稿できる

...、あなたはForm2の新しいインスタンスを毎回作成していると思いますか?


UPDATE:重複したハンドラを防ぐためには何もありませんので、ハンドラは次のとおりです。メニュー項目をクリックするたびに、それは(メニュー項目とnotifyicon)イベントに新しいハンドラを追加しますので[OK]を、私は見、それはです数回と呼ばれる。フォームはモーダルで表示されているため、閉じた後、再度開いて閉じてから閉じます。

ハンドラを一度登録する必要があります(コンストラクタなど)。また、あなただけのico_Refresh

+0

上に掲載されたコードを参照 –

2

でDoXmlParsingを呼び出すことができます何のコードがありませんように私は、あなたの質問から100%わからないんだけど、Form2の起動時に次のようなものを使っているようにそれは私に聞こえる:

Form2 f = new Form2(); 
f.Show(); 

フォームが常に正確に同じ場所に表示される場合は、「何回も」閉じなければならないというわけではありません。実際にそこに多くのものが表示されています。フォームを移動して、その下にフォームがあるかどうかを確認してください。 :)

代わりに、メモリに残るForm2クラスのインスタンスを1つ持ち、アプリが終了するまで閉じることをお勧めします。必要に応じて表示して非表示にします。

私はこの行が問題だと思う
+0

私はそれを考えましたが、タイトルバーをつかんで動かすと、1つのフォームしかありません。 –