Laden...

Funktion auslagern - combobox nicht bekannt

Erstellt von Nisbo vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.509 Views
N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren
Funktion auslagern - combobox nicht bekannt

Servus,

ich (Neuling) hoffe ich habe das richtige Forum gefunden, denke zumindest das es Grundlagen sind woran ich gerade scheiter ^^

Also ich habe vor eine Funktion oder Methode wie sie hier wohl genannt wird in eine andere Datei auszulagern so das der Code nicht zu viel wird in der "Hauptdatei"

Also habe ich eine Klasse hinzugefügt
Projekt --> Klasse hinzufügen --> Klasse und auf hinzufügen geklickt
Habe die Datei umbenannt in RepeaterLaden.cs

dort ist dann das hier drin:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delta_Oskar_One
{
    class RepeaterLaden
    {
    }
}

Jetzt habe ich meine Funktion:

        private void RepeaterListeLaden(int laden)
        {
            // Repeater Liste einlesen
            if (laden == 1)
            {
                // Download aktuelle Liste
                WebClient webClient = new WebClient();
                webClient.DownloadFile("http://www.egal.de", @"RepeaterListe.txt");
            }

            // Liste leeren
            comboBox1.Items.Clear();

            try {
                string[] lineOfContents = System.IO.File.ReadAllLines("RepeaterListe.txt");
                foreach (var line in lineOfContents)
                {
                    // HTML entfernen, warum auch immer das da angezeigt wird ;)
                    string v = line.Replace("<BR />", "");

                    string[] tokens = v.Split(',');

                    int intValue;
                    Int32.TryParse(tokens[0].Trim(), out intValue);

                    if (intValue >= 262000 && intValue <= 263000)
                    {   
                        comboBox1.Items.Add(tokens[1] + " - " + tokens[0]);
                    }
                }

                if (laden == 1) MessageBox.Show("Repeater Liste wurde aktualisiert.");
            }
            catch
            {   
                RepeaterListeLaden(1);
            }

        }

in die Ausgelagerte Datei verschoben was dann so aussieht:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Delta_Oskar_One
{
    class RepeaterLaden
    {
        private void RepeaterListeLaden(int laden)
        {
            // Repeater Liste einlesen
            if (laden == 1)
            {
                // Download aktuelle Liste
                WebClient webClient = new WebClient();
                webClient.DownloadFile("http://www.egal.de", @"RepeaterListe.txt");
            }

            // Liste leeren
            comboBox1.Items.Clear();

            try
            {
                string[] lineOfContents = System.IO.File.ReadAllLines("RepeaterListe.txt");
                foreach (var line in lineOfContents)
                {
                    // HTML entfernen, warum auch immer das da angezeigt wird ;)
                    string v = line.Replace("<BR />", "");

                    string[] tokens = v.Split(',');

                    int intValue;
                    Int32.TryParse(tokens[0].Trim(), out intValue);

                    if (intValue >= 262000 && intValue <= 263000)
                    {
                        comboBox1.Items.Add(tokens[1] + " - " + tokens[0]);
                    }
                }

                if (laden == 1) MessageBox.Show("Repeater Liste wurde aktualisiert.");
            }
            catch
            {
                RepeaterListeLaden(1);
            }

        }
    }
}

Im Hauptprogramm wird jetzt natürlich die
RepeaterListeLaden(0);
bemängelt da es die nicht mehr gibt, also habe ich es durch
RepeaterLaden.RepeaterListeLaden(0);
ersetzt, danach wird wieder gemeckert das der Zugriff auf Grund des Schutzgrades nicht möglich ist.

OK also habe ich in der Ausgelagerten Datei die
private void RepeaterListeLaden(int laden)

ersetzt durch
public static void RepeaterListeLaden(int laden)

also aus private ein public gemacht und das static noch eingefügt, public verstehe ich ja noch aber static nicht wirklich. Naja egal zumindest kein Fehler mehr im Hauptprogramm.

In der ausgelagerten Datei werden jetzt noch ein paar Punkte bemängelt
WebClient webClient = new WebClient();
konnte ich durch einfügen von
using System.Net;
im Header beheben

dann noch
using System.Windows.Forms;
in den Header das die **MessageBox **funktioniert

So und jetzt kommt das Problem wo ich nicht weiter komme, ich kann
comboBox1.Items.Clear();
nicht ansprechen, der Ausgelagerte Code sagt
"Der Name "comboBox1" ist im aktuellen Kontext nicht vorhanden, die Fehlerbeschreibung zu CS103 die hier im Forum verlinkt ist hat mir nicht geholfen da dort was von Try erzählt wird und es nicht um ausgelagerte Funktionen geht.

So schaut der Code jetzt insgesamt aus:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Windows.Forms;

namespace Delta_Oskar_One
{
    class RepeaterLaden
    {
        public static void RepeaterListeLaden(int laden)
        {
            // Repeater Liste einlesen
            if (laden == 1)
            {
                // Download aktuelle Liste
                WebClient webClient = new WebClient();
                webClient.DownloadFile("http://www.egal.de", @"RepeaterListe.txt");
            }

            // Liste leeren
            comboBox1.Items.Clear();

            try
            {
                string[] lineOfContents = System.IO.File.ReadAllLines("RepeaterListe.txt");
                foreach (var line in lineOfContents)
                {
                    // HTML entfernen, warum auch immer das da angezeigt wird ;)
                    string v = line.Replace("<BR />", "");

                    string[] tokens = v.Split(',');

                    int intValue;
                    Int32.TryParse(tokens[0].Trim(), out intValue);

                    if (intValue >= 262000 && intValue <= 263000)
                    {
                        comboBox1.Items.Add(tokens[1] + " - " + tokens[0]);
                    }
                }

                if (laden == 1) MessageBox.Show("Repeater Liste wurde aktualisiert.");
            }
            catch
            {
                RepeaterListeLaden(1);
            }

        }
    }
}

Ich hoffe jemand kann mir als C# ANFÄNGER helfen, ist vermutlich für euch ne Kleinigkeit und schneller zu beantworten als einen Let Me Google That For You Link zu posten 😉
Und ja ich google schon danach 😉

EDIT: ach ja ich habe auch schon das versucht
Form1.comboBox1.Items.Clear();
dann meckert das Programm wieder wegen dem Schutzgrad

T
17 Beiträge seit 2015
vor 8 Jahren

Zum Thema static lässt sich in der MSDN folgendes finden : https://msdn.microsoft.com/de-de/library/79b3xss3.aspx

Deine Methode hat keinen Zugriff auf die Member deiner Form. Damit das ganze funktioniert, müsstes du die ComboBox mit an die ausgelagerte Methode übergeben, ala:

public void RepeaterListeLaden(int laden, ComboBox CB)
{
     ...
     CB.Items.Clear();
     ...
}
N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Danke für die Antwort aber
Combobox CB
will er nicht, sagt der Typ oder Namespacename Combobox wurde nicht gefunden
habe auch schon
comboBox1 CB versucht
geht auch nicht

T
17 Beiträge seit 2015
vor 8 Jahren

Groß-Kleinschreibweise beachten: ComboBox

N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Jetzt habe ich neue Fehlermeldungen im Bezug auf den Fehlenden Parameter zur Combobox beim Funktionsaufruf und muss wie es ausschaut jedes mal der Funktion eine Combobox mit übergeben, das will ich natürlich nicht und kann auch nicht im Sinne des Erfinders sein.

Da muss es noch nen anderen Weg geben

T
17 Beiträge seit 2015
vor 8 Jahren

Wie wärs denn damit: In der Methode lädst du lediglich die Items, gibst diese zurück und in der Form werden diese dann in der ComboBox aktualisiert.

Nach dem (3-)Schichten-Prinzip.

C
2.121 Beiträge seit 2010
vor 8 Jahren

und muss wie es ausschaut jedes mal der Funktion eine Combobox mit übergeben, das will ich natürlich nicht

Warum willst du das nicht? Die Methode muss wissen was für eine Combobox sie bearbeiten soll.

N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Man ist das kompliziert, da ist es doch alles in einer Datei lassen viel einfacher.
Bei PHP gab es ein einfaches include einer Datei und man hatte keinerlei Probleme 😦

Warum ich die Box nicht übergeben will ?
Mal davon abgesehen das ich nicht weiß wie ^^
hätte ich dann das Problem wenn ich aus der Funktion raus z.B. eine textBox befüllen will wieder und muss alles umschreiben, irgendwann habe ich dann 100 Parameter in dem Funktionsaufruf

Glaube bei Objectpascal ging das wen man das Form vorne ran gestellt hat
Form1.combobox

@Tisdo
dann habe ich ja wieder code im Hauptteil und kann mir das Ganze ja eigentlich auch sparen

T
17 Beiträge seit 2015
vor 8 Jahren

Mal davon abgesehen das ich nicht weiß wie ^^

Ähh? Deine ComboBox heißt comboBox1? ->

RepeaterListeLaden(5, comboBox1);

hätte ich dann das Problem wenn ich aus der Funktion raus z.B. eine textBox befüllen will wieder und muss alles umschreiben, irgendwann habe ich dann 100 Parameter in dem Funktionsaufruf

Deshalb Schichten

N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Ok so einfach ist das ^^
na gut überredet, habe jetzt die Übergabe der combobox mit drin, in der ausgelagerten Datei muss ich dann CB statt comboBox1 übergeben, macht ja auch Sinn

funktioniert freu

4.931 Beiträge seit 2008
vor 8 Jahren

Hallo Nisbo,

ich sehe es auch so wie Tisdo. Deine Methode macht zu viele Aufgaben (Download, Parsen, GUI-Zugriff). Du solltest die einzelnen Aufgaben voneinander entkoppeln (ich weiß, daß dies für einen Anfänger oft nicht leicht ist, wenn eben die Grundlagen noch nicht richtig sitzen - aber nur durch Fehler lernt man 😉

Fange damit an und erzeuge für jede der einzelnen Aufgaben eine Methode (mit passenden Parametern). Danach kannst du dir dann passende Hilfsmethoden schreiben, welche die einzelnen Aufgaben aufrufen (so kannst du dann einfacher verschiedene Methoden erzeugen, ohne den gesamten Code umschreiben (oder sogar kopieren) zu müssen).

PS:
C# ist im Gegensatz zu PHP eben objektorientiert, d.h. du mußt die Unterschiede zwischen Klassen, Objekte, statisch, nicht-statisch, Zugriffsmodifizierer (public, protected, private, internal) etc. verstehen.

Und falls dir das 3-Schichten-Prinzip nichts sagt: [Artikel] Drei-Schichten-Architektur

N
Nisbo Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

PHP geht auch Objektorientiert ^^
Mag ich genau so wenig 😄 😄 😄

Ich weiß das es ganz toll ist wenn man es versteht nur ich fühle mich da immer wie in einer deutschen Behörde.

Am Eingang fragt man wo bekommt man den Führerschein, der sagt gehe Raum 123
dort angekommen muss man dann aber in Raum 231 um Formular B beantragen zu können, dort muss man aber für de Beantragung erst Formular A haben was es in 345 gibt. Für 345 braucht man aber Zugangsberechtigung C die es bei 555 gibt 😄 😄 😄

Ich habe halt Code gerne zusammen, da habe ich es im Überblick und muss mich nicht durch 10 Dateien klicken. Aber liegt halt an mir, habe den Draht das alles was man in 10 Zeilen in eine Datei packen kann dann wohl in 9 Dateien mit jeweils 20 Zeilen auslagert 😄 😄 😄

Aber kommt evtl ja schon noch, der erste Schritt ist getan und eine Funktion oder Methode ist ausgelagert ^^

P
441 Beiträge seit 2014
vor 8 Jahren

Objektorientierung in PHP ist nicht mit C# vergleichbar.

Abgesehen davon, dass es "seit neuestem" in PHP auch Namespaces gibt, die meist nicht genutzt werden, wenn man die aber nutzt haben sie den gleichen Effekt wie in C#: Entweder man gibt eine using direktive oder den kompletten Namespace an, damit der aktuelle Scope auch in den passenden Namespace hineinschauen kann oder man bekommt die Meldung, dass die Klasse nicht bekannt ist 😉

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Nisbo,

C# ist im Gegensatz zu PHP eben objektorientiert

Wahrscheinlich ist gemeint: "C# ist im Gegensatz zu PHP eben typisiert".

Solche Vergleiche (oder Vergleiche mit Behörden 🤔 ) sind allerdings wenig hilfreich oder gar zielführend. Wenn man mit C# arbeiten möchte, muß man sich eben mit den Grundlagen beschäftigen.

Schau dir den verlinkten Artikel an, dann sollte auch klar werden, wo das Problem liegt.

Christian

Weeks of programming can save you hours of planning

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo Nisbo,

zur angesprochenen 3 Schichten-Architektur, ich würde folgenden Aufbau verwenden:

Ein Controller, der dem Form ein Model bereitstellt und für das Laden der Daten zuständig ist.
Die Model-Klasse, die die Auflistung der ComboBox-Items enthält und deine Form, die die Einträge anzeigt.

In der Praxis z.B. so etwas:


public class MyModel
{
     public BindingList<string> Items { get; set; }

     public MyModel()
     {
           this.Items = new BindingList<string>();
     }
}


public class MyController
{
      // Model for holding the data
      public MyModel Model { get; set; }

      public MyController()
      {
            this.Model = new MyModel();
      }

      public void LoadList(int load)
      {
             if (load == 1)
            {
                // Download aktuelle Liste
                WebClient webClient = new WebClient();
                webClient.DownloadFile("http://www.egal.de", @"RepeaterListe.txt");
            }

            this.Model.Items.Clear();

                string[] lineOfContents = System.IO.File.ReadAllLines("RepeaterListe.txt");
                foreach (var line in lineOfContents)
                {
                    // HTML entfernen, warum auch immer das da angezeigt wird ;)
                    string v = line.Replace("<BR />", "");

                    string[] tokens = v.Split(',');

                    int intValue;
                    Int32.TryParse(tokens[0].Trim(), out intValue);

                    if (intValue >= 262000 && intValue <= 263000)
                    {
                        this.Model.Items.Add(tokens[1] + " - " + tokens[0]);
                    }
                }                
      }
}

Und die Anzeige in der View wie folgt:


public class MyForm : Form
{
     private MyController _controller;
     private MyModel _model;

     public MyForm()
     {
           this.InitializeComponents();
           this._controller = new MyController();
           this._model = this._controller.Model;

           this.comboBox1.DataSource = this._model.Items;
     }
}

Ist alles ungetestet und bedarf sicher einiger Anpassungen durch dich. Aber so hast du erst einmal eine saubere Trennung.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
2.121 Beiträge seit 2010
vor 8 Jahren

Noch eine Anmerkung zu PHP. Ich habe auch schon damit gearbeitet. Irgendwann funktionierts dann schon, nachdem man alle Fehler eliminiert hat die durch doppelt vergebene Namen oder Schreibfehler auftreten. Spaß macht es keinen.
Bei kleinen Projekten lässt sich das noch überblicken. Bei größeren nicht mehr. Da kannst du allem was zuweisen und alles auslesen wie du willst, egal ob es das gerade gibt oder nicht. Irgendwas passiert immer oder es passiert einfach gar nichts, nur nicht das was man will.

Freu dich über eine Sprache die dir gleich sagt dass sie etwas nicht kennt, der du lieber mit geringem Mehraufwand sagen musst was du genau meinst.

5.657 Beiträge seit 2006
vor 8 Jahren

Die PHP-Diskussion muß hier aber nicht nocheinmal aufgewärmt werden, dazu verweise ich einfach mal auf Suche Argumente für C# im Vergleich zu PHP für ein konkretes größeres (=500PT) Web-Projekt und ASP.NET + MSSQL vs. PHP + MySQL.

Christian

Weeks of programming can save you hours of planning