ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
802
802
EMPFEHLEN
-
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 :1 2 3 4 5 6 7 8 9 10 11 12
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 :1 2 3 4
private void m_NeuenOrtAnlegen() { mdi.m_LadeOberflaeche(Datenhaltung.Programm_Steuerung.Programmablauf.ortAnlegen); //Aufruf 2. Methode, Übergabeparameter ist ein Enum. }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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 ausGrüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
13.01.11 13:39 #3
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
Hallo NSR,
es gibts auch noch eine andere Möglichkeit. Stichwort: AutoResetEvent
Am besten schaust du mal hier:MSDN
Grüsse
-
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ä?

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!Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
14.01.11 11:58 #6
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
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.
-
Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
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
-
16.01.11 12:59 #10
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
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
-
Würde ich nicht so machen. Es genügt, wenn alle Forms/Controls in einem einzigen Thread erstellt wurden (außer wenn irgendein Control als solches für die eigene Darstellung bereits viel Rechenleistung benötigt).
Lieber sollte man rechenintensive Operationen in Threads auslagern. Aber nicht das Control, welches die Operation startet.
Links zu Multithreading mit .Net:
Give Your .NET-based Application a Fast and Responsive UI with Multiple Threads
Safe, Simple Multithreading in Windows Forms, Part 1
Safe, Simple Multithreading in Windows Forms, Part 2hihi = -h²
-
17.01.11 12:39 #12
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
@Shakie
Haste wohl recht
Ähnliche Themen
-
Ant Benutzereingabe
Von Eichi im Forum Java GrundlagenAntworten: 1Letzter Beitrag: 21.01.11, 13:11 -
C# Warten bis Prozess beendet ist - erst dann mit Code fortfahren.
Von Carpo im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 30.09.10, 21:31 -
Warten von warten? *Konfusion*
Von Cromon im Forum SmalltalkAntworten: 8Letzter Beitrag: 26.04.10, 16:04 -
Benutzereingabe in Textfeld tun
Von i-mehl im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 29.02.04, 12:09 -
Benutzereingabe
Von gEr|Steven im Forum Javascript & AjaxAntworten: 9Letzter Beitrag: 18.04.02, 19:19





Zitieren


Login





