Laden...

Formular mittels Activator.CreateInstance(...) erstellen - aber bitte nur ein Exemplar?!

Erstellt von ho70 vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.109 Views
H
ho70 Themenstarter:in
20 Beiträge seit 2006
vor 17 Jahren
Formular mittels Activator.CreateInstance(...) erstellen - aber bitte nur ein Exemplar?!

Hallo,

ich habe folgendes gemacht:

  1. eine DLL mit benutzen Klassen (auch Forms) erstellt - namespace xControls. Diese DLL enthält auch die benötigten Interfaces.
  2. in dieser xControls DLL ist auch ein erweitertes DataGridView, welches als Auswahlliste dient und per Doppelclick das Bearbeitungsformular für den Datensatz öffnet, außerdem kann das Bearbeitungsfenster durch eine [Edit]-Schaltfläche geöffnet werden.
  3. eine Windows Anwendung erstellt, welche die Controls der Dll verwendet - namespace xClient
  4. von einer Form (mit dem genannten DataGridView und der [Edit]-Schaltfläche) aus xControls eine neue Form abgeleitet - Click auf [Edit] funktioniert auch, auch wenn ich einen Datensatz im DataGridView 'doppelclicke'.

Das Problem ist, wenn ich die Bearbeitungsform wieder schließe und anschließen einen weiteren Doppelclick auf den DataGridView mache öffnet sich die Bearbeitungsform 2x, beim nächsten Mals dann 3x usw.

Der verwendete Code (im Button_Click, Grid_CellDoubleClick macht nur ein cmdEdit.PerformClick()) in der xControls.DLL:


string sTemp = "xClient." + m_sEditForm;
ObjectHandle obj = Activator.CreateInstance("xClient", sTemp);
IMyFormInterface IClass = (IMyFormInterface)obj.Unwrap();
IClass.RunForm(iId);

Laut Debugger wird bereits das cmdEdit.PerformClick mehrfach angesprungen, sofern ich vorher ein anderes Bearbeitungsfenster geschlossen habe (jeweils mittels this.Close() in einer [Schliesen]-Schaltflache.

Kann mir bitte jemand helfen, dieses Problem zu klären?

Danke und Gruß Henning

347 Beiträge seit 2006
vor 17 Jahren

Warum benutzt du kein Dictionary in deiner Facory?
Kieken ob zu dem Typen schon eine Instanz angelegt wurde, ansonsten anlegen und ins Dctionary werfen.
Aber IMHO ist das für Forms ziemlich unnütz und riecht nach unüberlegtem "RADifiziertem" Design. 😉

T
68 Beiträge seit 2006
vor 17 Jahren

ANdere Lösung. Bei den Klassen wo nur ein Object existieren soll das Singleton Pattern(siehe Design Pattern) anwenden. Dann kann es nur ein Objekt geben.
Falls du den Zugriff von mehreren Objekten unterbinden willst kannst dann noch eine Quasi Anmeldeliste im SingletonObject einbauen. Wo du entweder dann nach der Reihe die Zugriffe abarbeitest. oder sogar nur einenn einzigen Zugriff erlaubst.
😉

greetz TiTime

H
ho70 Themenstarter:in
20 Beiträge seit 2006
vor 17 Jahren

Danke für die Antworten!
Mein Ziel ist aber, dass die Benutzer mehrere Forms zum Bearbeiten geöffnet haben können.
Also z.B. bei Aufträgen: Eine Form mit der Liste der Aufträge und den dazugehörigen Positionen. Doppelclick in die Aufträge -> Bearbeiten des 'Auftragskopfes', dann Doppelclick in die Positionen -> Bearbeiten der Auftragsposition, weitere Doppelclick in die Positionen -> andere Auftagspositione bearbeiten usw. Bei Kunden-Adressen-Kontakten dasselbe aber als 1:n:m Beziehung.
Der Doppelclick in die 'oberste' Liste (also z.B. Auftragskopf) funktionert, auch mehrmals hintereinander. Nur bei den Auftragspositionen werden mehrere Forms erzeugt - je öffter ich dort Doppelclicke um so mehr Forms öffnen sich. Eigenartigerweise ist das Ganze nicht auf einen Speziellen Formulartyp beschränkt, d.h. z.B. 1. Doppelclick auf Position -> eine EditForm, 2. Doppelclick auf Position -> zwei neue EditForms (sofern die 1. vorher geschlssen wurde, Doppelclick auf Kopf -> eine EditForm für den Kopf, 3. Doppelclick auf Position -> sechs EditForms für Position usw.

[Zwischendurch tritt kein Fehler auf, so daß dieses Verhalten nicht durch nicht behandelte Exceptions hervorgerufen werden kann.]

[edit]
Wenn ich die z.B. die Form mit der Liste der Aufträge und Ihren Positionen zwischendurch Schließe, beginnt das 'Hochzählen' der Anzahl der Form wieder neu - ohne das ganze Programm neuzustarten.
[/edit]

Gruß Henning

N
750 Beiträge seit 2004
vor 17 Jahren

hängst du dich bei jedem klick in irgendwelche events rein?
und da durch deine methode aufgerufen wird..... ?!?!

?( wer suchet, der findet auch! :]

H
ho70 Themenstarter:in
20 Beiträge seit 2006
vor 17 Jahren

@nils: Ich habe nur in CellDoubleClick:


if (e.ColumnIndex >= 0 && e.RowIndex >= 0) 
  cmdEdit.PerformClick();

und ButtonClick (s.o.) verwendet.

Es sieht so aus, als ob die 'Form-mit-den-Listen' beim Doppelclicken weis, wieviele EditForms für die Positionen geöffnet sein sollten -> und öffnet dann ausreichend viele.
Wenn ich nur die [Edit]-Schaltfläche verwende funktioniert es einwandfrei.

Gruß Henning