Auf Form zugreifen

TresPuntos

Cadet 4th Year
Registriert
Juni 2018
Beiträge
113
Hallo,

ich bin auf ein Problem gestoßen und zwar würde ich gerne zur Übersichtlichkeit neben der Form1 2 Klassen erstellen, die jeweil einen Konstruktor für die Objekterzeugung besitzen.
Nur finde ich im Internet viele ähnliche Probleme, doch ich habe damit Schwierigkeiten das Umzusetzen.
Wie bekomme ich es hin, dass die Klasse Ordner auf die Buttons oder Listen aus der Form1 zugreifen kann??
Ich muss ein Konzept und meine Implementierung später veranschaulichen und so ist dies dafür besser geeignet.
 
Welche Sprache? Was willst Du genau machen, es gibt mehrere Wege, einen Controller, Binding, hartes Reinprogrammieren in die Form/Klasse!?

Du kannst Wahrscheinlich die Control-Objekte an Deine Methode Deiner Klasse übergeben, aber so wie sich das liest hast Du die Grundlagen der Objektorientierung noch nicht verstanden.
 
Sry vergessen zu erwähnen.
Also ich programmieren in c# in Visual Studio.
Ich müsste auf eine Liste zugreifen und diese mit den Ordnernamen füllen.
Die Methode sollte sich in der Klasse Objekt befinden und die Liste aus Form1 befüllen.
 
TresPuntos schrieb:
Wie bekomme ich es hin, dass die Klasse Ordner auf die Buttons oder Listen aus der Form1 zugreifen kann??
Das ist der falsche Weg und erzeugt unnötige Abhängigkeiten. Umgekehrt ist es besser, die Form füllt die Liste mit den Ordner-Objekten, die z.B. über eine Hilfsklasse geladen werden. Oder man verwendet eines der gängigen Pattern (MVC/MVVM).

Wieso überhaupt Windows Forms? Du scheinst ja erst anzufangen und da würde ich dann gleich WPF nehmen. Da kann man dann MVVM auch viel besser umsetzen.
 
rille schrieb:
Das ist der falsche Weg und erzeugt unnötige Abhängigkeiten. Umgekehrt ist es besser, die Form füllt die Liste mit den Ordner-Objekten, die z.B. über eine Hilfsklasse geladen werden.
Also meinst du damit, dass ich nur eine Ordner-Klasse mit Konstruktor besitze und den Rest des Coding in der Form mache?
 
Im Prinzip ja, noch besser wäre aber, eines der gängigen Pattern (MVC, MVP, MVVM) zu verwenden. Aber keine Ahnung was bei WIndows Forms so gebräuchlich ist, ich verwende das nicht. Eine schnelle Google-Suche hat z.B. Composite UI Application Block ausgespuckt.

Ist aber für die einfache Aufgabe vermutlich Overkill. Das klingt ja auch eher nach einer Hausaufgabe.
 
Was ist denn "der Rest des Codings"? Was genau sollen die Klassen repräsentieren? Du musst schon etwas mehr Informationen rausrücken, damit man dir helfen kann.
Wie in Post 4 beschrieben, lädst du die Daten nachher einfach über .DataSource in das Control. Die Form sollte dementsprechend eine Methode bereitstellen, um dein Ordner-Objekt zu laden oder gleich die ganze Logik implementieren, wenn es nur ein Miniprojekt ist und sich alles in der Form abspielt.
 
@Enurian Also ich habe eine größere Anwendung mit vielen Methoden etc. geschrieben, ich wollte es Übersichtlicher gestalten, indem ich 2 weitere Objekte erstelle, die ihre Methoden besitzen und die Form greift über Button-Click oder sonstige auf diese Methoden. Habe eine Ordnerliste und eine Dateienliste und für diese wollte ich jeweilige Klassen erstellen mit Methoden dafür. Habe mal ein Screenshot von meinen derzeitigen Methoden, damit es klarer erscheint, wieso ich es machen will.

1530870501565.png
 
Du kannst / solltest nur auslagern, was nicht ins UI gehört. Das SelectedIndexChanged Event, Click Events etc. finden alle weiterhin in der Form statt.
Wenn DateienVerschieben() hingegen im Dateisystem rumfuhrwerkt und durch ein Click Event aufgerufen wird, kann das in deine neue Klassen (sofern inhaltlich sinnvoll). Dann liest du im click() die Objekte aus, um die es geht und rufst dann deren Methode (wie z.B. eben DateienVerschieben() ) auf.
 
@Enurian Bei meiner Klasse wird die Liste aber in der Klasse gefüllt, wie kann ich dann durch Form auf die liste zugreifen und somit die Listbox füllen?
 
Zuletzt bearbeitet:
Na offensichtlich muss das Form die Liste von deiner Klasse bzw. dem Objekt daraus erhalten. Und diese Liste kommt dann in .DataSource, wie bereits in Post 4 erwähnt.
 
Also ich habe jetzt diese beiden Klassen. Mein Problem ist es, dass ich in der Methode von CmdOrdnerLaden_Click aber nur den OrdnerNamen brauch und in die liste setzen muss. Wie kann ich bei lstOrdner.DataSource = testFall.OrdnerList; nur die OrdnerNamen hinzufügen? Den OrdnerPfad brauche ich nämlich in anderen Methoden und würde den deshalb im Konstruktor behalten.

C#:
public partial class Form1 : Form
    {
        Ordner testFall = new Ordner();
        public Form1()
        {
            InitializeComponent();
        }
        private void CmdOrdnerLaden_Click(object sender, EventArgs e)
        {
            testFall.OrdnerListen.Clear(); //clear the List
            String SourcePart = Path.Combine(TxtPfadQuelle.Text, @"Apps\");
            //gibt alle Dateien aus
            if (Directory.Exists(SourcePart))
            {
                foreach (var ordnerPfad in Directory.GetDirectories(SourcePart, "*.*", SearchOption.TopDirectoryOnly)) //sucht nach allen Dateien im Ordner und Unterordner
                {
                    string ordnerName = ordnerPfad.Substring(SourcePart.Length);
                    testFall.OrdnerListen.Add(new Ordner(ordnerPfad, ordnerName));
                }
            }
            else
            {
                MessageBox.Show("Der eingegebene Pfad existiert nicht!");
            }
          
            lstOrdner.DataSource = null;
            lstOrdner.DataSource = testFall.OrdnerList;
        }
    }
 

class Ordner
    {
        public ArrayList OrdnerListen = new ArrayList();
        private string ordnerPfad;
        private string ordnerName;
        public Ordner()
        {
            ordnerPfad = "";
            ordnerName = "";
        }
        public Ordner(string ordnerPfad, string ordnerName)
        {
            this.ordnerPfad = ordnerPfad;
            this.ordnerName = ordnerName;
        }
        public string OrdnerPfadBekommen
        {
            get
            {
                return ordnerPfad;
            }
        }
        public string OrdnerNameBekommen
        {
            get
            {
                return ordnerName;
            }
        }
    }
 
Evtl. ToString() der Klasse Ordner überschreiben und nur den Namen ausgeben

=> Link
 
testFall.OrdnerListen.Select(Current => Current.OrdnerNameBekommen);
Und das an datasource zuweisen. Allerdings je nachdem was du dann machen willst nicht die Lösung.
 
Zurück
Oben