2016-04-25 22 views
1

Ich habe ein Formular-Menü, das nicht vollständig entsorgen wird. Unten ist der vollständige Formularcode. Es ist Teil eines größeren Systems, sodass andere Formulare geöffnet und geschlossen werden, bevor das Menü geöffnet wird.Winform nicht vollständig entsorgen

Es gibt einen Formular-Timer, der jede Sekunde auslöst und druckt, ob das Formular entsorgt wird oder nicht. Es gibt eine Schaltfläche, die ein anderes Formular öffnet, Suchen und Menü schließen. Die Suche hat auch einen Timer, der anzeigt, ob es entsorgt wird oder nicht.

Wenn Menü öffnet, ist die Debug-Ausgabe als

erwartet
*********** (in main menu): Disposed False 
*********** (in main menu): Disposed False 

Wenn ich auf, erhalte ich Timer für beiden Menüs Zecken und Suchen

*********** (in main): Disposed True 
*************** (in search) Disposed False 

Es zeigt, dass die erste Instanz von Menu ist entsorgt, aber offensichtlich läuft der Timer noch. Als ich suchen Ausgang und Main geöffnet ist, gibt es nun zwei Haupt Timer

*********** (in main): Disposed True 
*********** (in main): Disposed False 

läuft ich halten kann dies zu tun (klicken Sie auf Suchen und Ausgang zu öffnen) und die Anzahl der Haupt Timer läuft Erhöhung hält. Ich bin perplex. Hier ist der Code für die Haupt

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace Gui 
{ 
public partial class Menu : Form 
{ 
    private System.Windows.Forms.Timer timer1; 
    private Button button1; 
    private IContainer components; 

    public Menu() 
    { 
     InitializeComponent(); 
    } 

    private void Menu_Load(object sender, EventArgs e) 
    { 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     Debug.Print("*********** (in main): Disposed {0}", IsDisposed); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var search = new Search(); 
     search.Show(); 
     Close(); 
    } 
    private void InitializeComponent() 
    { 
     this.components = new System.ComponentModel.Container(); 
     this.timer1 = new System.Windows.Forms.Timer(this.components); 
     this.button1 = new System.Windows.Forms.Button(); 
     this.SuspendLayout(); 
     // 
     // timer1 
     // 
     this.timer1.Enabled = true; 
     this.timer1.Interval = 1000; 
     this.timer1.Tick += new System.EventHandler(this.timer1_Tick); 
     // 
     // button1 
     // 
     this.button1.Location = new System.Drawing.Point(11, 17); 
     this.button1.Name = "button1"; 
     this.button1.Size = new System.Drawing.Size(125, 32); 
     this.button1.TabIndex = 0; 
     this.button1.Text = "button1"; 
     this.button1.UseVisualStyleBackColor = true; 
     this.button1.Click += new System.EventHandler(this.button1_Click); 
     // 
     // Menu 
     // 
     this.ClientSize = new System.Drawing.Size(282, 253); 
     this.Controls.Add(this.button1); 
     this.Name = "Menu"; 
     this.Load += new System.EventHandler(this.Menu_Load); 
     this.ResumeLayout(false); 
    } 
} 
} 
+0

Sie verweisen also immer auf das Formular? Wie könnte es dann entsorgt werden? – TaW

+0

Bitte zeigen Sie den Code von 'Search', der das Hauptformular wieder öffnet. Meine Vermutung ist, dass Sie eine neue Instanz des Formulars erstellen, anstatt das vorhandene erneut anzuzeigen. Vor allem, weil du es näher rufst, anstatt es zu verstecken. –

+0

@TaW - Entsorgung hat nichts mit einer Referenz zu tun. –

Antwort

3
this.timer1 = new System.Windows.Forms.Timer(this.components); 

Es sieht aus wie Sie Kopie/den Inhalt einer Datei Designer.cs einer Formularklasse eingefügt. Die InitializeComponent() -Methode ist mit Sicherheit Standard. Aber Sie haben es nicht richtig gemacht, Sie haben tatsächlich das this.components Mitglied vergessen. Welche existiert nur aus einem Grund und entsorgt irgendwelche Komponenten, die die Formularklasse verwendet. Wie Timer1. Es ist automatisch für alle Steuerelemente, die Sie auf dem Formular ablegen, sie können über das Element Steuerelemente des Formulars gefunden werden, aber Komponenten benötigen zusätzliche Hilfe.

Also nicht einfach kopieren/einfügen InitializeComponent() Sie must copy/paste die Dispose() -Methode auch:

protected override void Dispose(bool disposing) { 
     if (disposing && (components != null)) { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

Und der Timer stoppt nun tickt, wenn Sie das Formular schließen.

+0

Wie richtig du bist. Ich weiß nicht, wie das passiert ist; Ich habe es nicht ausgeschnitten und eingefügt, es ist nur irgendwie in der Datei Menu.cs aufgetaucht. Ich war ein wenig überrascht, ließ es aber in Ruhe. Wie auch immer, das kümmert sich sehr gut, danke. – blearyeye