C# Paar Fragen zum Einsatz eines zweiten Forms

eightcore

Lt. Commander
Registriert
Juli 2008
Beiträge
1.644
Guten Tag.

Über einen Button wird ein zusätzliches Form aufgerufen.

Code:
Form SpezNr = new Anrufererkennung.SpezelleNummern();
            SpezNr.Show();

Problem 1:

Eigentlich möchte ich, dass das primäre Fenster gesperrt wird, wenn das zweite Fenster geöffnet wird. Also müsste ich SpezNr.ShowDialog() verwenden, nur gibt es da ein Problem:
Wenn das zweite Form aufgerufen wird und man es während dem Laden (es wird in einem Backgroundworker eine Ini-Datei in eine DataGridView-Liste gelesen; das kann schon mal eine Sekunde dauern) schliesst, stürzt das Prgramm ab.
ObjectDisposedException - Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname : "MainWindow".
Das betrifft den Code der Program.cs:

Code:
frmMain = new MainWindow();
               
                frmMain.SetNewArgs(astrArg);

                    Application.Run(frmMain);

Anscheinend wirkt also hier der Garbage Collector.

Wenn ich in der Program.cs keine Parameter übergeben müsste, könnte ich anstelle des Codes oberhalb diesen verwenden (so ist es auch standardmässig, wenn man in Visual Studio ein neues Projekt erstellt):

Code:
            Application.Run(new Form1());

So wäre die Deklarierung gleich in derselben Zeile. Nur kann ich das in meinem Fall nicht machen (oder doch?).

Das ganze passiert eben nur, wenn ich das zweite Form mit "ShowDialog" öffne; mit der "Show"-Methode funktioniert es einwandfrei. Wie kann ich diesen Fehler beheben?

Problem 2:

Ich möchte dem zweiten Form noch eine Variable übergeben. Das liesse sich ja in meinem Fall mit "spezNr.Variablenname" lösen, nur bringe ich es nicht zustande, denn irgendwie muss man die Variable ja noch deklarieren. Da fehlt mir Wissen.
Wie kann ich gleich beim Aufrufen des zweiten Forms eine Variable übergeben?


Vielen Dank schon mal.


MfG | eightcore
 
Problem 2: Du kannst eine eigene Form schreiben (sprich eigene class und dann eben ": Form", der du dann wie du willst Variablen/Methoden hinzufügen kannst. Ist natürlich etwas Arbeit. Soweit ich mich erinnere, kann man die Standardformen nicht weiter auf diese Art erweitern, da ich genau das auch mal versuchen wollte.
 
Am einfachsten ist es, wenn du dir eine eigene Show/ShowDialog Methode machst:

PHP:
public void ShowDialog(string Link)
{
   this.urlToDownload = Link;
   this.ShowDialog();
}

Edit:
Bei Problem 1:
Zeig uns mal etwas Code von deinem Fenster, in dem der Background-Worker gestartet wird, am besten die ganze Klasse.
 
Zuletzt bearbeitet:
Problem 1:

Du schließt die Form, bevor der Worker fertig ist. Daher die ObjectDisposedException. Abonnier das FormClosing-Event und wenn es gefeuert wird während dein BackgroundWorker noch aktiv ist, brichst du diesen ab.

Problem 2:

Code:
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        private string _name;

        public Form2()
        {
            InitializeComponent();
        }

        public Form2( string name )
            : this()
        {
            _name = name
        }
    }
}

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

        private void OnBtnClick( object sender, EventArgs e )
        {
            Form2 form = new Form2( "foobar" );
            form.Show();
        }
    }
}
 
Zurück
Oben