Laden...

Kann eine Form schliessen aber nicht erneut öffnen

Erstellt von latrine66 vor 16 Jahren Letzter Beitrag vor 16 Jahren 7.841 Views
L
latrine66 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren
Kann eine Form schliessen aber nicht erneut öffnen

Hallo Allerseits!
Ich habe ein Prob mit Visual 2005 und dem schliessen von Windows Forms. Wenn ich aus der Mainform eine zweite aufrufe klappt es das erstemal. Wenn ich die zweite form schliesse und erneut öffnen möchte kommt die Fehlermeldung System.ObjectDisposedException wurde nicht behandelt.
Message="Auf das verworfene Objekt kann nicht zugegriffen werden.\r\nObjektname: Form2."

Ich habe auf Visual 2003 meinen Techniker gemacht und bin mir keiner Schuld bewusst. was bei einem formname.close() falsch sein soll. Ferner hab ich noch die Frage was bei der Deklaration das partial class zu bedeuten hat.

Bin für jede antwort dankbar !

Wer nicht fragt bleibt dumm 🙂

3.430 Beiträge seit 2007
vor 16 Jahren

Hallo laterine66,

bitte beachte folgendes: [Hinweis] Wie poste ich richtig?

Beschreibe dein Problem genau, und poste deinen Code (+ angabe wo die Exception ausgelöst wird).

Ferner hab ich noch die Frage was bei der Deklaration das partial class zu bedeuten hat.

Schaue dir dazu diesen Link (Understanding and Using partial classes) an. Dort wird das Ganze erklärt.

mfg
michlG

2.760 Beiträge seit 2006
vor 16 Jahren

Ist es möglich das du deine Form in eine member variable gestopft hast und dann bei dieser einfach nochmal Show() aufrufst.
Dann musst du die Form nämlich nach dem Closen nochmal mit new MyForm() instanzieren bevor du sie erneut öffnest Close() ruft intern nämlich Dispose() auf was ganz gut zu deiner Exception passen würde.

Funktioniert:


   Form frm = new Form();
         frm.Show();
         frm.Close();
         frm = new Form();
         frm.Show();

Funktioniert nicht:


   Form frm = new Form();
         frm.Show();
         frm.Close();
         //frm = new Form();
         frm.Show();

L
latrine66 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren

Sorry für den Code


namespace test2form2
{
    public partial class Form1 : Form
    {
        Form2 test2 = new Form2();
        public Form1()
        {
            InitializeComponent();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test2.Show();
        }
    }
}

Ich habe in den Forms nichts weiter drin. wenn ich test2 das erstemal schliesse mit dem X oder per this.close() auf einem Button geht es. Beim zweitem Aufruf aus Form1 Raus gibt er mir den oben genannten fehler.

Wer nicht fragt bleibt dumm 🙂

2.760 Beiträge seit 2006
vor 16 Jahren

So ists richtig:


namespace test2form2
{
    public partial class Form1 : Form
    {
        Form2 test2 = new Form2();
        public Form1()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (test2.IsDisposed)
                test2 = new Form2();
            test2.Show();
        }
    }
}

L
latrine66 Themenstarter:in
3 Beiträge seit 2008
vor 16 Jahren

danke für die schnelle Antwort! Werds gleich testen 😁

Wer nicht fragt bleibt dumm 🙂

43 Beiträge seit 2008
vor 16 Jahren

Hi,
ich hab ein ähnliches Problem:

Hier der Code, das Ziel ist wenn ich auf ButtonEntertainment klicke daß das FormTS geschlossen wird und das FormEntertainment geöffnet wird.

program.cs

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormTS());
        }
    }
}

FormTS.cs:

namespace WindowsFormsApplication1
{
    public partial class FormTS : Form
    {
    FormEntertainment entertainment = new FormEntertainment();
        public FormTS()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void buttonEntertainment_Click(object sender, EventArgs e)
        {
            if (entertainment.IsDisposed)
                entertainment = new FormEntertainment();
            FormEntertainment.Show();
                  
        }
    }
}

FormEntertainment.cs:

namespace WindowsFormsApplication1
{
    public partial class FormEntertainment : Form
    {
        public FormEntertainment()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }
}

Der Debugger schmeisst an Fehler sobald ich auf den ButtonEntertainment drücke.
"Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: FormEntertainment."

Gruss

D
89 Beiträge seit 2008
vor 16 Jahren

 private void buttonEntertainment_Click(object sender, EventArgs e)
        {
            if (entertainment.IsDisposed)
                entertainment = new FormEntertainment();
            FormEntertainment.Show();

        }

du solltest auch die variable mit .show aufrufen und nicht das das Form ->


 private void buttonEntertainment_Click(object sender, EventArgs e)
        {
            if (entertainment.IsDisposed)
                entertainment = new FormEntertainment();
            entertainment .Show();

        }

43 Beiträge seit 2008
vor 16 Jahren

Danke für den Hinweis, has geändert und nochmal durch den Debugger gejagt. Problem besteht weiterhin:

Zeile:

Application.Run(new FormTS());

Fehler:

Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: FormEntertainment.

2.760 Beiträge seit 2006
vor 16 Jahren

Ich glaube du schmeißt da ein bisschen was durcheinander...

Wenn du "FormTS" initialisieren willst (Application.Run(new FormTS()); ) warum sollte dann ein Fehler zu "FormEntertainment" kommen?

43 Beiträge seit 2008
vor 16 Jahren

Der Fehler tritt auf sobald ich auch den ButtonEntertainment im FormTS Klicke um das FormEntertainment zu öffnen

2.760 Beiträge seit 2006
vor 16 Jahren
Application.Run(new FormTS());  

Dann hast du aber die falsche Codezeile gepostet.

Wie schaut dein Code denn jetzt aus?
Schau dir auch das: 🛈 📗 nochmal an.

D
89 Beiträge seit 2008
vor 16 Jahren

versuch mal ganz einfach das ->


namespace WindowsFormsApplication1
{
    public partial class FormTS : Form
    {
   
        public FormTS()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void buttonEntertainment_Click(object sender, EventArgs e)
        {
            FormEntertainment entertainment = new FormEntertainment();
            FormEntertainment.Show();

        }
    }
}

43 Beiträge seit 2008
vor 16 Jahren

Hi,
warum es da hackt keine Ahnung, ich hab die zwei Forms neu gemacht und es geht...
Danke für die Hilfe

E
55 Beiträge seit 2008
vor 16 Jahren

versuch mal ganz einfach das ->

  
namespace WindowsFormsApplication1  
{  
    public partial class FormTS : Form  
    {  
     
        public FormTS()  
        {  
            InitializeComponent();  
        }  
  
        private void Form1_Load(object sender, EventArgs e)  
        {  
  
        }  
  
        private void buttonEntertainment_Click(object sender, EventArgs e)  
        {  
            FormEntertainment entertainment = new FormEntertainment();  
            FormEntertainment.Show();  
  
        }  
    }  
}  
  

ähm, kann auch nicht funktionieren, wenn du show auf die klasse machst

du musst das show auf die referenz(also auf enterteinment machen)

D
89 Beiträge seit 2008
vor 16 Jahren

ah sorry falsch kopiert 😉 ... so ->


namespace WindowsFormsApplication1
{
    public partial class FormTS : Form
    {

        public FormTS()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void buttonEntertainment_Click(object sender, EventArgs e)
        {
            FormEntertainment entertainment = new FormEntertainment();
            entertainment.Show();

        }
    }
}