Laden...

Aktion klappt nur beim ersten Mal

Erstellt von Nesso vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.588 Views
Nesso Themenstarter:in
18 Beiträge seit 2010
vor 12 Jahren
Aktion klappt nur beim ersten Mal

Hallo Community,

folgende Situation habe ich:

Eine Windowsforms Anwendung, die zwei Datenbankconnections auf unterschiedliche Datenbanken verbindet.
Ich lasse mir dann die Tabellen und Spalten ausgeben.

Allerdings ist es so, wenn ich den Ersten Connect starte und danach eine Tabelle in der Listbox anklicke um mir die Spalten anzuzeigen funktioniert das solange, bis ich den Zweite Connect auslöse (zweiter Eventhändler, Button_Connect2).
D.h. wenn ich in die Listbox des ersten Connect wieder anklicke, zeigt er mir die Spalten einer Tabelle nicht mehr an, weil er keine Connection zur Datenbank mehr hat, bzw. geht der Eventhandler verloren?! (so vermute ich...)

Frage: Nach dem ich mich hier [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) eingelesen habe, frage ich mich ob es Sinn mach einen Thread zu programmieren, oder ob es eine andere Möglichkeit gibt.

Ich dachte an sowas wie, den Eventhandler1 in Eventhandler2 zu übergeben oder so was ähnliches...allerdings weiß ich nicht, ob so eine Methedo "schick" und perfomant ist...und ob das so einfach geht wie ich es mir vorstelle...

Ich würde mich über eure Erfahrungswerte sehr freuen!

Liebe Grüße

Nesso

C
2.121 Beiträge seit 2010
vor 12 Jahren

Bisschen durcheinander alles?!

Für jede Datenbank gibts eigene Listboxen?
Nimmst du eine einzige Connection für beide Datenbanken? Dann sollte natürlich eine DB-Aktion beendet sein wenn die zweite beginnt. Aber das dürfte sowieso der Fall sein, da du bisher ja dem Anschein nach noch keine Threads hast. Dann kann man erst wieder klicken wenn die bisherige Aktion zu Ende ist.
Was meinst du mit er hat keinen Connect mehr? Gib ihm halt wieder einen.
Warum sollte der Handler weg sein? Prüf das nach, indem du die irgendwas ausgeben lässt oder debuggst. Vermuten ist da nicht hilfreich, besser wären Tatsachen.

Natürlich könntest du das in Threads auslagern. Aber wenn die Aktionen nicht lange dauern sollten, würd ich mir das Theater erst mal sparen.
Es muss auf jeden Fall auch so funktionieren. Wenns das nicht tut, hast du ein Problem drin dem ich erst mal auf den Grund gehen würde.
Das mit Eventhandler übergeben hab ich auch nicht ganz kapiert.

Nesso Themenstarter:in
18 Beiträge seit 2010
vor 12 Jahren

Hallo Chilic,

ja etwas schwamig formuliert von mir, da ich schon eine Weile dran bin und das ganze für mih total verständlich ist^^.

Ich erkläre es gerne nochmal:

Für jede Datenbank gibt es zwei Listboxen und einen Button für die Verbindung zur Datenbank.

Die erste Lisbox zeigt die Tabellen. die sich in der Datenbank befinden.
Die zweite Listbox zeigt, wenn man auf der ersten Listbox eine Tabelle anklickt, die Spalten derer an.

So, jetzt habe ich die zweite Datenbankverbindung, die genau wie oben beschrieben ist funktioniert. Auch mit zwei Listboxen etc.

Beide Connection laufen (sollten) parallel zu jeweils zwei verschiedenen Datenbanken. Sie werden aber nicht gleichzeitig gestartet, sondern nacheinander also wenn ich auf den Button "Connect(1)" und/oder "Connect(2)" drücke.

Das Problem ist dann:

  • Erste Verbindung zur Datenbank funktioniert fehlerfrei.
  • zweite Verbindung zur Datenbank auch, Tabelle und Spalten lassen sich wunderbar auswählen so wie bei der Ersten.
  • wechsel ich jetzt zu der Listbox mit der ersten Verbindung, ist die Listbox noch gefüllt mit den Tabellen (vom Resultset), aber sobald ich etwas anklicke, zeigt es mir in der zweiten Listbox die Spalten nicht mehr an, ergo es besteht keine Verbindung mehr zu der ersten Datenbank.

Daher die Vermutung mit dem Handler, dass er mir von der ersten Verbindung verloren geht, wenn ich die zweite Verbindung aufbauen möchte...

Deshalb dachte ich an etwas wie, ich übergebe jeden Connect-Button den Handler des jeweiligen, so bleibt meine Verbindung immer bestehen...
Oder eben ich löse für jede Verbindung einen Thread aus, was ich hoffentlich vermeiden kann...

Da liegt eben mein Problem, wie ich das am besten lösen kann, so dass die erste Verbindung aufrecht bleibt, wenn ich die zweite Verbindung aufbaue.

hoffe ich habe mich besser ausgedrückt, sorry nachmal!

LG Nesso

F
10.010 Beiträge seit 2004
vor 12 Jahren

Das hat überhaupt nichts mit Threads, verlorenen events oder sonst was zu tun.
Da es bei tausenden von Leuten funktioniert wird es an deinem Code liegen.
Da du den aber verschweigst.....

Und du solltest wirklich lernen Probleme für andere verständlich zu beschreiben.

C
2.121 Beiträge seit 2010
vor 12 Jahren

ich übergebe jeden Connect-Button den Handler des jeweiligen

Der Handler ist die "OnClick" Methode, der wird der Button schon von selbst übergeben, steht im sender. Und andersrum, dem Button den Handler übergeben brauchst du nicht denn das hat bereits der Formulardesigner gemacht. Der Handler hängt sich nicht von selber aus.

Da musst du debuggen und dir anschauen was im OnClick passiert, was die Connections sagen und was der Code so alles macht.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Nesso,

ich will dir nicht zu nahe treten und ich schreibe das folgende in der guten Absicht zu helfen. Wenn dabei unverblümt bin, dann weil ich es wichtig finde, dass auch das Unbequeme klar rüberkommt.

Ich sehe das wie FZelle und würde noch einen Schritt weiter gehen: Du solltest lernen, Probleme für dich korrekt und verständlich zu beschreiben. Mir scheint, dass du hier haufenweise falsche Annahmen triffst. Ich habe überhaupt nicht das Gefühl, dass du verstanden hast, was du da tust.

Warum sollte z.B. die erste Datenbankverbindung verloren sein, wenn das zweite ListView nicht mehr aktualisiert wird, zu dessen aktualisieren ja die zweite Verbindung benutzt wird. Und wieso gibt es überhaupt zwei Verbindungen, wenn du nur eine Datenbank hast?

Mit Threads und EventHandlern hat das vermutlich gar nichts zu tun. Diese braucht man zwar, wenn die Datenbankzugriffe zu lange dauern, aber bei so einfachen Sachen, wie alle Tabellen auslesen bzw. alle Spalten der gewählten Tabelle, kann es durchaus schnell genug gehen. Und wenn es nicht schnell genug geht, dann mach es wie in [FAQ] Warum blockiert mein GUI? beschrieben. Dadurch ändert sich die grundsätzliche Struktur des Programms kaum.

Aber wie dem auch alles sein. Du musst zuerst mal den Fehler lokalisieren. Das kannst du am besten selber, den du hast den Code, du hast den Debugger und du kannst etwaige Exceptions fangen. Bis die näheren Umstände klar sind, ist es müßig, darüber zu spekulieren.

Wenn du vor hast, Code zu posten: Bitte poste nur den möglichst kleinen Codeabschnitt, der den Fehler verursacht. Poste auf keinen Fall den kompletten Code, nichtmal den kompletten Code des Forms.

herbivore

Nesso Themenstarter:in
18 Beiträge seit 2010
vor 12 Jahren

Hallo,

nein ihr habt schon recht, im erklären bin ich wohl eine Null.
Und bin wegen der Kritik auch niemanden böse.
Ich sehen ja, dass man mir hier helfen möchte.

Ich werde mich am Montag wieder mit der Problematik auseinandersetzen und es strukturierter angehen.

Trotzdem Danke, Erklärungsversuch 3 folgt eventuell... 😄

LG Nesso