Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Klasse als Parameter
SvenC
myCSharp.de - Member



Dabei seit:
Beiträge: 29

Themenstarter:

Klasse als Parameter

beantworten | zitieren | melden

Hallo,

ich habe folgendes Problem:

beim Klick auf einen Button wird ein kleines Form geöffnet, welches eine ProgressBar und ein Textfeld einthält und eine Instanz der Klasse MeinBericht anlegt.
Im "FormShown"-Event des Forms wird dann die MeinBericht.erstelleBericht()-Methode aufgerufen.

Nun möchte ich mein Form dynamischer machen - es soll für verschiede Berichtstypen funktionieren. Ich gebe dem Kostruktor den Typ mit (MeinBericht1 oder MeinBericht2; alle vom Interface IBericht abgeleitet mit einer Methode erstelleBericht()), und davon soll dann im Kostruktor ein Objekt angelegt werden und im FormShown-Event die erstelleBericht()-Methode aufgerufen werden.


Hier mein bisheriger Stand:

public partial class FormProgress : Form
{
   MeinBericht1 myRep;
     
   public FormProgress()
   {
            wndHandle = this.Handle;
            myRep = new MeinBericht1();

            this.Shown += new EventHandler(FormProgress_Shown);            
   }        

   void FormProgress_Shown(object sender, EventArgs e)
   {                                    
            if (myRep.erstelleBericht(Jahr, ID, wndHandle) == -1)
                MessageBox.Show(repProj.ErrorMessage);

            this.Close();
   }
}


Aufruf über:

FormProgress fp = new FormProgress();
fp.ShowDialog();


Wie bekomme ich das hin? Generics? Delegates?
private Nachricht | Beiträge des Benutzers
feadur
myCSharp.de - Member



Dabei seit:
Beiträge: 722
Herkunft: Bonn

beantworten | zitieren | melden

du kannst auch einfach einen enum im konstruktor übergeben und basierend darauf deine IBericht Instanz erzeugen. Eine andere Möglichkeit wäre eine generische Methode, dann müssten aufrufende Klassen aber die konkreten Implementierungen kennen. Deshalb würde ich die eunm / Factory variante vorziehen.
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

Hi,

Generics sind genau richtig:


public partial class FormProgress<B> : Forum 
where B : IBericht, new()
{
   public FormProgress()
   {
            wndHandle = this.Handle;
            myRep = new B();
            this.Shown += new EventHandler(FormProgress_Shown);
   }
}


new FormProgress<MeinBericht1>().ShowDialog();
new FormProgress<MeinBericht2>().ShowDialog();
Gruß
Juy Juka
private Nachricht | Beiträge des Benutzers
SvenC
myCSharp.de - Member



Dabei seit:
Beiträge: 29

Themenstarter:

beantworten | zitieren | melden

Hallo JuyJuka,

Danke für deine Hilfe, so in der Richtung hatte ich mir das vorgestellt.
Allerdings ist mir das ", new()" an dieser Stelle völlig neu! Was hat es denn damit auf sich?

Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:

FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gefunden.
private Nachricht | Beiträge des Benutzers
rizi
myCSharp.de - Member



Dabei seit:
Beiträge: 402

beantworten | zitieren | melden

Zitat
Allerdings ist mir das ", new()" an dieser Stelle völlig neu! Was hat es denn damit auf sich?

diese constraint-angabe,sagt aus,dass die Klasse die fuer B eingesetzt wird über einen parameterlosen konstruktor verfügen muss!
Zitat
Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:
FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gefunden.

nein,dass hat damit nichts zu tun,d.h du hast Dispose(bool) nicht implementiert....


lg rizi
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 500

beantworten | zitieren | melden

Zitat
Dieses new() ist sicherlich auch irgendwie dafür verantwortlich, dass ich jetzt in der FormProgress.Designer.cs folgenden Fehler bekomme:
FormProgress.Dispose(bool)": Es wurde keine passende Methode zum Überschreiben gef
Zitat
nein,dass hat damit nichts zu tun,d.h du hast Dispose(bool) nicht implementiert....

Ich denke nicht, dass er IDisposable nicht implementiert hat, da meistens der Designer bzw. das VS, wenn man Form Klassen erstellt, dieses Interface implementiert. Ich gehe mal davon aus, dass SvenC eine Umbenennung des Namespaces vorgenommen hat und dies eventuell in der Designer-Klasse vergessen hat. Da es sich dabei um partielle Klassen handelt, kann es nun sein, dass die beiden Teile der Klasse nicht zueinanderfinden, da diese eventuell durch eine Umbenennung in unterschiedlichen Namensräumen sich befinden. Ergo, es wird die Implementierung der Dispose Methode nicht mehr gefunden.

Gruß, DaMoe
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DaMoe80 am .
private Nachricht | Beiträge des Benutzers
rizi
myCSharp.de - Member



Dabei seit:
Beiträge: 402

beantworten | zitieren | melden

stimmt,das könnte natürlich sein,ich bin davon ausgegangen,dass er die klasse zur testzwecken ohne designer erstellt hat!!

lg rizi
private Nachricht | Beiträge des Benutzers
SvenC
myCSharp.de - Member



Dabei seit:
Beiträge: 29

Themenstarter:

beantworten | zitieren | melden

... ich musste nur noch in der FormProgress.designer.cs hinter "class FormProgress" das <B> hinzufügen (ich dachte das macht das VS automatisch?) - jetzt funktioniert alles!

Danke nochmal an alle für die Hilfe!

SvenC
private Nachricht | Beiträge des Benutzers