myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Funktion auslagern - combobox nicht bekannt
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Funktion auslagern - combobox nicht bekannt

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21


Nisbo ist offline

Funktion auslagern - combobox nicht bekannt

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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:

C#-Code:
        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:

C#-Code:
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:

C#-Code:
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

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Nisbo am 23.08.2015 07:38.

Neuer Beitrag 23.08.2015 07:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tisdo
myCSharp.de-Mitglied

Dabei seit: 09.01.2015
Beiträge: 14


Tisdo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
public void RepeaterListeLaden(int laden, ComboBox CB)
{
     ...
     CB.Items.Clear();
     ...
}

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Tisdo am 23.08.2015 08:52.

Neuer Beitrag 23.08.2015 08:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Nisbo

Nisbo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 23.08.2015 08:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tisdo
myCSharp.de-Mitglied

Dabei seit: 09.01.2015
Beiträge: 14


Tisdo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Groß-Kleinschreibweise beachten: ComboBox
Neuer Beitrag 23.08.2015 08:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Nisbo

Nisbo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 23.08.2015 09:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tisdo
myCSharp.de-Mitglied

Dabei seit: 09.01.2015
Beiträge: 14


Tisdo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Tisdo am 23.08.2015 09:19.

Neuer Beitrag 23.08.2015 09:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.037


chilic ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
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.
Neuer Beitrag 23.08.2015 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Nisbo

Nisbo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 23.08.2015 09:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tisdo
myCSharp.de-Mitglied

Dabei seit: 09.01.2015
Beiträge: 14


Tisdo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Mal davon abgesehen das ich nicht weiß wie ^^

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

C#-Code:
RepeaterListeLaden(5, comboBox1);

Zitat:
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
Neuer Beitrag 23.08.2015 09:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Nisbo

Nisbo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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*
Neuer Beitrag 23.08.2015 09:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.637
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 23.08.2015 09:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nisbo
myCSharp.de-Mitglied

Dabei seit: 21.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Nisbo

Nisbo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

PHP geht auch Objektorientiert ^^
Mag ich genau so wenig :D :D :D

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 :D :D :D

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 :D :D :D

Aber kommt evtl ja schon noch, der erste Schritt ist getan und eine Funktion oder Methode ist ausgelagert ^^
Neuer Beitrag 23.08.2015 10:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Papst Papst ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.09.2014
Beiträge: 275
Entwicklungsumgebung: VS2017
Herkunft: Kassel


Papst ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 ;)
Neuer Beitrag 23.08.2015 12:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.398
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi Nisbo,

Zitat von Th69:
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 verwundert ) 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
Neuer Beitrag 24.08.2015 14:31 Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.241
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
public class MyModel
{
     public BindingList<string> Items { get; set; }

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

C#-Code:
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:

C#-Code:
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.
Neuer Beitrag 24.08.2015 14:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.037


chilic ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am 24.08.2015 17:49.

Neuer Beitrag 24.08.2015 17:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.398
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 24.08.2015 18:11 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 06.07.2020 06:49