Autor Beitrag
Flyde
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.03.09 20:47 
Hi,

ich bin der neue *g* und ich bin spontan von c++ auf c# umgestiegen und bis jetzt lief alles relativ gut.. dennoch habe ich ein kleines Problem bezüglich des zugriffes auf ein Formelement von einer extra Klasse aus.

Problem:
Ich habe eine Klasse CMitarbeiter, in der gibt es eine Methode "void Auflisten();".
In dieser Klasse will ich eine ComboBox mit den Daten einer SQL-Abfrage füllen.. Leider scheitert es genau an diesem Schritt.

Wenn ich beispielsweise
ausblenden C#-Quelltext
1:
frmMitarbeiterAuswahl.cbMitarbeiter.Items.Add("Test");					

compiliere dann bekomme ich folgendes:

"Für das nicht statische Feld, die Methode oder die Eigenschaft DB_Test.frmMitarbeiterAuswahl.cbMitarbeiter ist ein Objektverweis erforderlich. (CS0120)"

Leider bin ich es so aus c++ gewohnt, dennoch habe ich nach dem Fehler CS0120 gesucht und immer wieder gelesen das ich ein Objekt der Form erstellen muss, gesagt getan:

ausblenden C#-Quelltext
1:
2:
frmMitarbeiterAuswahl MitarbeiterAuswahl = new frmMitarbeiterAuswahl();
MitarbeiterAuswahl.cbMitarbeiter.Items.Add("Test");


Und schon gibt es keine Compilerfehler mehr.. leider ist das resultat nun: Er macht garnichts, der Code wird schlicht und weg ignoriert.
Ich drücke beispielsweise auf einen Button mit diesem Quellcode und die Reatkion ist 0, hab ich auch mit verschiedenen Dingen probiert, z.b. die Form zu schließen etc. .. 0 Reaktion

Bitte um auflösung meines Mysteriums *g*
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 19.03.09 21:06 
Hallo und :welcome:!

Ein Mysterium ist das ganz und gar nicht - Du musst unterscheiden zwischen der Klasse frmMitarbeiterAuswahl und den Instanzen dieser Klasse. Du möchtest auf die bereits bestehende Instanz dieser Klasse zugreifen, während Dein letzter Quellcode eine neue Instanz erzeugt, was an der bestehenden Instanz natürlich nichts ändert.

Generell solltest Du es unbedingt vermeiden, aus einer anderen Klasse direkt auf die GUI einer Form zuzugreifen. Für die Darstellung ist Deine Klasse nicht zuständig, sie ist für die Logik "hinter" Deinem Programm zuständig. In diesem Fall sollte Deine Klasse eine Methode zur Verfügung stellen, welche die Ergebnisliste zurückgibt. Wie diese dann dargestellt wird, ist dann nicht mehr deren Sorge.

Diese Methode rufst Du dann in Deiner Form auf und füllst die Ergebnisliste in die Combobox ein.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Flyde Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.03.09 21:16 
Danke für den Tipp, werde mich dran halten.

Dann taucht aber ein anderes Problem auf

Ich wollte ja aus einer Datenbank eine ComboBox auffüllen und jedes Ergebnis wird in einer while-schleife mit ComboBox.Items.Add hinzugefügt.

Wenn ich nun die Form unberührt lassen soll dann müsste ich alles aus der Methode "auflisten();" in einen String speichern und diesen per return zurückgeben.. das ist ja alles kein problem aber wie speicher ich die Ergebnisse denn so, das ich sie auch wieder einzeln per "add" in die ComboBox hinzufügen kann?

Von der Logik verstehe ich es, ich kenne nur noch nicht alle möglichkeiten die einem C# bietet.

Edit: Ergebnisse aus der Datenbank zählen, einen Array erstellen und die Ergebnisse darin speichern und den Array zurückgeben? würde das klappen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 19.03.09 21:41 
Ja, das mit dem Array würde prinzipiell funktionieren.

Besser dürfte aber eine List<T> sein, weil Du dann nicht vorher die Einträge zählen musst, sondern mit der Add-Methode arbeiten kannst. Zu beachten ist dann aber, dass die Verwendung von List<T> ein Implementationsdetail ist, welches die "Außenwelt" nichts angeht. Daher sollte der Rückgabetyp der Methode sowas wie IEnumerable<T> sein.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Flyde Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.03.09 22:22 
Hui okay, davon hab ich noch 0 gehört, ich ergoogle mir die nutzung mal und schau dann was ich mach ;) aber danke
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 19.03.09 22:24 
Ich empfehle das Suche bei Google OPENBOOK VISUAL C#. In diesem Fall die Kapitel zu Generics und Interfaces.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 20.03.09 10:17 
Hallo und auch noch :welcome:

Kleine Ergänzung: List<T> ist eine vernünftige Lösung. Wenn die Daten aber sowieso aus einer Datenbank stammen, ist sehr oft (meistens?) DataTable praktischer/sinnvoller. Diese kann auch direkt als DataSource an eine ComboBox gebunden werden; durch DisplayMember wird festgelegt, welche Spalte zur Anzeige benutzt werden soll. Zur Anzeige im Formular übergibst Du einfach eine Referenz auf diese DataTable - fertig.

Gruß Jürgen
Flyde Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 20.03.09 17:04 
Ich seh schon, das wird mich mal wieder einige stunden an Arbeit kosten bis ich gescheit mit windows oberflächen umgehen kann.. :) Bis jetzt nur so 0815 Dinger gemacht

Dennoch danke, eine kurze Frage hätte ich aber noch.. Ich hab, generell in egal welcher Sprache ich programmiere, immer das gleiche Problem mit arrays.

Ich hab eine Klasse und die brauch irgendwann den Array xyz.. aber was mache ich, wenn ich anfangs noch garnicht weiß wie viele Felder es brauch? Klar muss im Speicher Platz reserviert werden aber wie will man Arrays dynamisch verwenden, wenn man immer einen festen Wert setzen muss?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 20.03.09 17:27 
user profile iconFlyde hat folgendes geschrieben Zum zitierten Posting springen:
aber was mache ich, wenn ich anfangs noch garnicht weiß wie viele Felder es brauch?

Wenn du also
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
nicht vorher die Einträge zählen
kannst, sondern am besten einfach mit einer
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Add-Methode arbeiten
würdest? Ja, da würde ich doch glatt die
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Verwendung von List<T>
empfehlen :D .

*scnr* :mrgreen:

PS: Generics und Typparameter hören sich erstmal ziemlich schrecklich an, aber eigentlich ist es beim Array nichts anderes: So wie bei einem int[] passen auch bei einer List<int> nur ints rein.

_________________
>λ=