Autor Beitrag
Dabra
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 23.11.13 13:12 
Hallo User der Entwickler-Ecke,

ganz kurz zu meiner Person.
Habe vor 2 Monaten angefangen mit C# und hab sonst auch keine Vorkenntnisse im Bereich Programmieren.
Nun bin ich vor einem Problem bei dem ich überhaupt keine Lösung finde.

Geg:
Habe mehrere Forms und eine Klasse Fach. Nun möchte ich mehrere verschieden Fächer anlegen bspw. Englisch usw.
Diese Objekte lege ich in einer Liste an: List<Fach> _list = new List<Fach>()
Nun meine Fragen:
Wo erstelle ich diese Liste?

Klasse Fach: Es wird jedes mal eine neue Liste erstellt wenn ich ein neues Objekt erstelle.

Eigene Klasse Fachliste mit static: Dort kann ich nicht auf die Liste zugreifen.

Form1: Wenn ich die List hier eintrage kann ich nicht von den anderen Forms drauf zugreifen.

Tut mir Leid für die Frage. Habe im Internet versucht die Lösung zu finden. Hat bisher immer geklappt. Doch bei diesem Problem komme ich einfach nicht weiter.

Könnt ihr mir bitte weiterhelfen?
Oder ist mein kompletter Ansatz falsch?

Vielen Vielen Dank

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 23.11.13 14:51 
Zitat:
Eigene Klasse Fachliste mit static: Dort kann ich nicht auf die Liste zugreifen.


Eine weitere statische Klasse ist nicht unbedingt das geschickteste aber wenn bei deinem Lernprozess static gerade das Thema ist ist das eigentlich der gewünschte Lösungsweg.
Zeig doch mal deine Fachliste Klasse und wie du auf die Liste in dieser Klasse zugreifen wolltest.

Überhaupt wäre es geschickt uns ein wenig Code zu zeigen von den Stellen wo es hackt. Es gibt hier dutzende von Wegen die je nach Anforderung oder Code den du schon hast mehr oder weniger passt. Wenn du uns per Code zeigst wo du stehst könne wir dich viel einfacher genau an dieser Stelle abholen.

Für diesen Beitrag haben gedankt: Dabra
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 23.11.13 14:55 
Hallo Dabra :welcome:

wenn du wirklich nur eine Fachliste für dein ganzes Programm benötigst, dann könntest du diese als static anlegen (entweder in der Hauptform oder aber in einer extra Klasse, wie von dir beschrieben).
Um auf eine static-Variable zuzugreifen, mußt du dann den Klassennamen davor angeben, z.B.
ausblenden C#-Quelltext
1:
Form._list;					

Evtl. hast du vergessen, diese Membervariable als public (oder internal) zu deklarieren, denn sonst kannst du bei dem impliziten private nur von der eigenen Klasse darauf zugreifen.

Gerade für public-Membervariablen benutzt man in C# aber (automatische) Eigenschaften (properties):
ausblenden C#-Quelltext
1:
public static List<Fach> FachList { get; private set; }					

Leider kann man diese nicht an dieser Stelle initialisieren, sondern muß dann im (statischen) Konstruktor der Klasse noch die Zuweisung durchführen:
ausblenden C#-Quelltext
1:
2:
3:
4:
static Form()
{
    FachList = new List<Fach>();
}

So kannst du dann von überall mittels Form.FachList darauf zugreifen.

Idealerweise würde man aber diese Liste in einer eigenen Klasse halten und am besten diese per Referenz an alle benötigten Form-Instanzen weitergeben.
Aber probiere ersteinmal den oben von mir beschriebenen Weg aus.

Für diesen Beitrag haben gedankt: Dabra
Dabra Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 23.11.13 15:41 
Oh man genial. Es geht :) Es geht es geht es geht :)
Habe jetzt 3 Tage versucht dahinter zu kommen warum und wieso es nicht geht.
Vielen vielen Dank für die schnelle Hilfe.
Ja das mit dem Code posten wäre ganz praktisch gewesen. Soweit hab ich nicht gedacht :)

Mein Fehler:
Habe 2 wichtige Sachen vergessen.
Den Konstruktor in Form und den {get;set}, (Wenn ich das private dabei steht dann gilt set nur für die klasse selbst?)

Hab das ganze jetzt mal so versucht.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
    class Fach
    {  
        public Fach(string name)
        {
             m_fachname = name;
        }
    }

    class Fachliste
    {
        public Fachliste()
        {
            _fachlist = new List<Fach>();
        }

        public static List<Fach> _fachlist { get; set; }     
    }

    public partial class FormNotenrechner : Form
    {
        public FormNotenrechner()
        {
            InitializeComponent();
        }

        //Click Events
        private void neuesFachAnlegenToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Fach objFach = new Fach("Deutsch");
            Fachliste._fachlist.Add(objFach);
        }
}

Die Frage ist jetzt ob der Lösungsweg sinnvoll ist, oder löst man das normal anders? Also ich bin nicht verpflichtet "static" zu verwenden. Ist reines Übungsprojekt von mir selbst.

Vielen vielen dank nochmal für die schnelle Hilfe.

mfg
Dabra

Moderiert von user profile iconTh69: Codeformatierung überarbeitet.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 23.11.13 16:29 
Zitat:
Die Frage ist jetzt ob der Lösungsweg sinnvoll ist, oder löst man das normal anders?


Es ist ein möglicher Lösungsweg. Sowas wie ~normal~ gibt es beim Programmieren eigentlich nicht. Normal wären am ehesten Dinge die unter dem Begriff Pattern (Muster) laufen. Ich spar mit ein paar zu nennen die man hier anwenden könnte. Die würden dir beim lernen nicht helfen ;)

Die erste Alternative zu einer statischen Klasse die es sich lohnt auszuprobieren wäre das herumreichen der Liste. Also am Anfang an zentraler Stelle die Liste erzeugen(in einer Standard Winformsanwendung z.B. in der zuerst gestartete Main Form) und an jeden Nutzer weiterreichen der sie braucht. Es hindert dich ja z.B. keiner daran deine FormNotenrechner Form so zu erweitern das mann über den Konstruktor die zu benutzende Liste übergibt (oder eine Property bzw. Methode für die Liste erstellt) und dann in der Form nutzt.

Für diesen Beitrag haben gedankt: Dabra
Dabra Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 23.11.13 18:01 
Ja man hat mir schon gesagt das bei 3 Programmierern 3 verschiedene Programme für die gleiche Lösung herauskommt :)
Mein Problem war vor allem das zugreifen über Methoden auf die Liste.
Aber jetzt kann ich auf jedenfall schonmal weitermachen :)

Vielen Vielen Dank nochmal und Klasse Forum :)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 24.11.13 11:36 
Hallo

schön, daß es jetzt bei dir läuft. Trotzdem wundert es mich ein bißchen bei deinem Code, denn in der Klasse Fachliste benutzt du zur Initialisierung nicht die von mir erwähnten Statische Konstruktoren, sondern nur den normalen Konstruktor (und dann müßtest du new Fachliste() irgendwo noch stehen haben).
Man kann auch eine ganze Klasse als static deklarieren, so daß davon keine einzelnen Instanzen erzeugt werden können (sondern eben nur immer ein Zugriff mittels "Klassenname." erfolgen muß):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public static class Fachliste
{
  // jetzt nur noch 'static' Konstruktor, Methoden, Eigenschaften und Felder hier erlaubt

  static Fachliste()
  {
  }
}

Für diesen Beitrag haben gedankt: Dabra
Dabra Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 24.11.13 11:44 
Ja ich erzeuge noch ein Objekt von Fachlist in FormNotenrechner.
Mein Gedankengang war: Form 1 läuft dauerhaft dadurch wird auch nur einmal das Objekt erzeugt.
Ist das schlecht?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 24.11.13 12:02 
Jain ;-)

So hast du jetzt eben einen Mischmasch aus nichtstatischen und statischen Membern - und das sollte man vermeiden. Dies macht das Lesen des Codes unnötig kompliziert und führt dann evtl. zu eigenartigem Verhalten bei Änderung des Codes.

Mit dem statischen Konstruktor brauchst du dich eben selber nicht mehr um die Initialisierung zu kümmern, da dies dann der Compiler (bzg. genauer das .NET-Laufzeitsystem) für dich übernimmt.

Und im zweiten Schritt kannst du dann komplett auf die nichtstatische Variante umschwenken (und dann die Fachliste-Instanz nur einmal in der Hauptform erzeugen und diese dann per Referenz an alle anderen Forms weiterreichen).

Unter anderem darüber habe ich auch einen Artikel geschrieben: Kommunikation von 2 Forms (sowie Beispielprojekt ganz unten). Dieser erklärt insbesondere auch die Anwendung von Eigenschaften und Ereignissen genauer.

Für diesen Beitrag haben gedankt: Dabra
Dabra Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 24.11.13 21:33 
Vielen Dank an TH69,
habe mir die Seite angeschaut komme aber nicht mit allem klar.
Habe versucht das Beispielprogramm zu verstehen, aber durchschaue die Logik dahinter nicht ganz, wie die Dialoge aufgerufen werden.
Aber das ist halb so wild.
Großen Großen Respekt für den Text und das Programm.
Finde es aber sehr schön zu sehen wie jemand, der sich damit auskennt, das ganze löst.
Werde öfters darauf zugreifen um zu spicken. :)

Habe es jetzt mit der statischen Klasse Fachliste gelöst und schaut ganz gut aus.
Wenn das Funktioniert werde ich mal an die Lösung ohne static setzen. (Step by Step :) )


Vielen Vielen Vielen Dank nochmal. Ich wär warscheinlich nicht auf die Lösung gekommen :) Danke :)