tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
802
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von NSR
    NSR NSR ist offline Mitglied Silber
    Registriert seit
    Nov 2008
    Beiträge
    94
    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;
                }
            }
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    napstermania napstermania ist offline Mitglied Silber
    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
     

  4. #4
    Avatar von NSR
    NSR NSR ist offline Mitglied Silber
    Registriert seit
    Nov 2008
    Beiträge
    94
    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.
     

  5. #5
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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 Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  6. #6
    napstermania napstermania ist offline Mitglied Silber
    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
     

  7. #7
    Avatar von NSR
    NSR NSR ist offline Mitglied Silber
    Registriert seit
    Nov 2008
    Beiträge
    94
    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.
     

  8. #8
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Zitat Zitat von NSR Beitrag anzeigen
    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.
    Zitat Zitat von NSR Beitrag anzeigen
    Hoffe das ist etwas besser/genauer beschrieben was ich haben möchte.
    Hat es!
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  9. #9
    Avatar von NSR
    NSR NSR ist offline Mitglied Silber
    Registriert seit
    Nov 2008
    Beiträge
    94
    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
     

  10. #10
    napstermania napstermania ist offline Mitglied Silber
    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
     

  11. #11
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von napstermania Beitrag anzeigen
    Eine neue Form würde ich immer in einem eigenen Thread starten.
    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 2
     
    hihi = -h²

  12. #12
    napstermania napstermania ist offline Mitglied Silber
    Registriert seit
    Jul 2004
    Ort
    Deutschland
    Beiträge
    95
    @Shakie
    Haste wohl recht
     

Ähnliche Themen

  1. Ant Benutzereingabe
    Von Eichi im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 21.01.11, 13:11
  2. Antworten: 1
    Letzter Beitrag: 30.09.10, 21:31
  3. Warten von warten? *Konfusion*
    Von Cromon im Forum Smalltalk
    Antworten: 8
    Letzter Beitrag: 26.04.10, 16:04
  4. Benutzereingabe in Textfeld tun
    Von i-mehl im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 29.02.04, 12:09
  5. Benutzereingabe
    Von gEr|Steven im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 18.04.02, 19:19