C# Code unterrbrechen und auf Benutzereingabe warten

NSR

Mitglied
Hi Leute,

ich habe folgendes Problem:
Ich habe ein MDI. In diesem habe ich nun eine NeuAnlegen-Form geöffnet. Wenn ich nun einer ComboBox der NeuAnlegen-Form ein neues Element hinzufügen möchte öffne ich eine weitere Form. Klicke ich in dieser auf Speichern, dann wird ein neuer Eintrag in eine Datenbank geschrieben.
Nun möchte ich, nachdem ich die Form fürs Hinzufügen geöffnet habe, dass sich der Code beim .Show wie .ShowDialog verhält und nicht im Programm weiter läuft. ShowDialog möchte ich allerdings nicht verwenden, denn ich gehe über 2 Methoden, um die hinzufügen-Form zu öffnen und möchte eigentlich einen Rückgabewert nicht über 2 Methoden weiterleiten.

Gut nach diesem Verwirrenden Schriften nun etwas Sourcecode.
Code:
private void btn_NeuerOrt_Click(object sender, EventArgs e)
        {
            this.m_NeuenOrtAnlegen();   //Hier wird die 1. Methode aufgerufen.
            //Hier soll der Code warten, damit in der Datenbank neue Orte angelegt werden
            //können, ohne dass der Code weiterläuft und dadurch die alten Einträge aus der
            //Datenbank zur ComboBox hinzufügt.
            DataTable orte = Datenbank.connection.execute("SELECT ort_id, standort from ort");
            //Zuweisung der Werte aus der Datenbank zu der ComboBox.
            cb_ort_id.DataSource = orte;
            cb_ort_id.ValueMember = "ort_id";
            cb_ort_id.DisplayMember = "standort";
        }

Code:
private void m_NeuenOrtAnlegen()
        {
            mdi.m_LadeOberflaeche(Datenhaltung.Programm_Steuerung.Programmablauf.ortAnlegen); //Aufruf 2. Methode, Übergabeparameter ist ein Enum.
        }

Code:
public void m_LadeOberflaeche(Datenhaltung.Programm_Steuerung.Programmablauf meinAblauf)
        {
            //Beim anlegen eines neuen Ortes soll Form Artikel anlegen nicht geschlossen werden.
            if (meinAblauf != Datenhaltung.Programm_Steuerung.Programmablauf.ortAnlegen)
            {
                if (this.MdiChildren.Count() > 0)
                { this.MdiChildren[0].Close(); }
            }
            
            switch (meinAblauf)
            {
                case Datenhaltung.Programm_Steuerung.Programmablauf.ortAnlegen:
                    OrtAnlegen ort = new OrtAnlegen(this);
                    ort.MdiParent = this;
                    ort.Dock = DockStyle.Fill;
                    ort.Show();
                    break;
            }
        }
 
Hi

Dann abonniere da, wo du Show() aufrufst das Closed-Event der neuen Form.
Wenn das ausgelöst wird, führst du den restlichen Code aus
 
Danke für die schnellen Antworten.

@napstermnia: Das AutoResetEvent ist doch nur für Multithreadding Programme geeignet.
@Nico: Damit habe ich doch aber fast des gleiche, als wenn ich aufs Button Speichern_Klick gehe, worauf ich ja auch warten möchte.
 
Hä? :confused:

Ich denk, du willst darauf warten, bis die Form geschlossen ist, um darauf reagieren zu können, ohne ShowDialog() zu nutzen?

Wenn nein, dann nochmal richtig beschreiben, bitte!
 
Hallo NSR,
wer zwingt dich denn dazu das AutoResetEvent nur zu nutzen um Threads zu synchronisieren.
Wenn ich dich richtig verstanden habe dann kannst du genau das damit auch realisieren. Ob es jetzt der eleganteste Weg ist das zu lösen sei ma dahin gestellt ;)
Wenn das nicht so ist dann steht ich auch grad aufm schlauch wie Nico. Dann bitte nochmal genauer erklären ;)

Grüsse
 
Also,

x = hier: Benutzereingabe.

1. es soll sich so verhalten wie .ShowDialig() -> An einer beliebigen Stelle im Code warten, bis x passiert.
2. In meinem Programm kann ich ShowDialog() nicht benutzen, da es ein MDI ist und da kommt dann immer ne Meldung, dass die zu ShowDialogende Form nicht die erste Form ist. (1. Form = MDI).
3. @Nico: Ich kann es schon so machen wie du sagst, aber ich möchte auch allgemein gerne Wissen, ob/wie es geht an einer stelle im Code zu warten.
4. @napstermania: Ich habs mit deinem Probiert, allerdings habe ich keine 2 Threads und dadurch bleibt der bei (siehe Code oben) 1. Code Zeile 3 stehen, friert die Oberfläche ein und dadurch kann ich das .Set() nicht mehr setzen.

Hoffe das ist etwas besser/genauer beschrieben was ich haben möchte.

Schonmal Danke,
Nico.
 
Hi

3. @Nico: Ich kann es schon so machen wie du sagst, aber ich möchte auch allgemein gerne Wissen, ob/wie es geht an einer stelle im Code zu warten.

4. @napstermania: Ich habs mit deinem Probiert, allerdings habe ich keine 2 Threads und dadurch bleibt der bei (siehe Code oben) 1. Code Zeile 3 stehen, friert die Oberfläche ein und dadurch kann ich das .Set() nicht mehr setzen.
Die beiden Varianten haben wir dir genannt. Du hast keine andere Chance, deinen Logik zu unterbrechen. Jedenfalls ist mir keine bekannt.
Hoffe das ist etwas besser/genauer beschrieben was ich haben möchte.
Hat es! :)
 
Hi,
schade dass es da nichts anderes gibt, des wäre manchmal schon hilfreich.
Naja dann mach ichs wohl wie du's gesagt hast.
Danke für eure Hilfe.

Schönes Wochenende,
Nico
 
Hallo NSR,

mal ein kleiner Tipp zum Stichwort Oberfläche friert ein.
Wenn du eine zweite Form öffnest, und diese im Haupthread läuft, wirst du immer das Problem haben das die Oberfläche nicht reagiert solange ein Fehler auftritt. (z.B. Datenbank ist offline)

Eine neue Form würde ich immer in einem eigenen Thread starten. Denn so wirst du nie den Haupthread blockieren und kannst im Fehlerfall ein Einfrieren/Absturz verhindern. Die Vorteile liegen da schon auf der Hand.

Bei komplexen Dialogbasierten Anwendungen wirst du am Multithreading sowieso nicht vorbeikommen. Dann kann naturlich auch das AutoResetEvent benutzt werden. Dafür gibt es auch schon bekannte Software Lösungen (Stichwort: Desig-Pattern wie das MVC oder MVVM Pattern) für synchronisierungen kann z.B. eine Statemachine implementiert werden. Man muss natürlich abwägen ob solche Patterns auch Sinn machen oder nur Overhead erzeugen.

Und warum nuzt du denn keine Events? In der Methode "btn_NeuerOrt_Click" rufst du einfach die Methode NeuenOrtAnlegen auf. Wenn die Daten in die Datenbank geschrieben wurden feuertst du ein Event an die Parentform und dort kannst du deine Werte zuweisen.

Grüsse
 

Neue Beiträge

Zurück