Laden...

von klasse auf form1 zugreifen

Erstellt von manuzi1 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.588 Views
Thema geschlossen
M
manuzi1 Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
von klasse auf form1 zugreifen

Hallo,

wie man sieht bin ich neu hier. Ich habe mir mal die FAQ angeschaut (um vlt was zu finden), jedoch bin ich nur darauf gestoßen:

[FAQ] Kommunikation von 2 Forms

und das hilft mir nich wirklich weiter, ich bin blutiger Anfänger, aber es gefällt mir.

Kurz zu meinem Problem:

Vorweg. Es sollte so sein, weil es so vorgegeben ist:

ich habe in Form1 das Array Spieler[3] und habe eine Klasse Spieler.

In der Klasse Spieler gibt es eine LabelAktualisieren() Methode.

Nun ich kann von Form auf Spieler zugreifen, aber leider nicht umgekehrt (was ja auch logisch ist).

Nun die logische Frage: Wie mache ich das bzw. was denkt sich der Lektor (kA ob die Aufgabe wirklich von ihm ist) warum ich nicht in Form1 die Methode LabelAktualisieren() machen soll?

Hier noch der Teilcode von Form1:

public partial class Form1 : Form
    {
        Spieler[] spieler = new Spieler[3]; //Spielarray mit 3 Referenzen auf Spieler Objekte speichern.

        public Form1()
        {
            InitializeComponent();
            
            
            
        }

        public void Form1_Load(object sender, EventArgs e)
        {
           
            spieler[0] = new Spieler() { Name = "Mike", Geld = 10 };
            spieler[1] = new Spieler() { Name = "Steiner", Geld = 15 };
            spieler[2] = new Spieler() { Name = "Kroni", Geld = 20};
        }

tjo und in LabelAkt. sollte dann halt sowas sein (das funkt natürlich nicht):

public void LabelAktualisieren()
        {
               label1.Text = spieler[0].Name + " hat " + spieler[0].Geld;
        }

das ganze soll sich aktualisieren, wenn ich auf einen button klick. da rufe ich es halt einfach auf.

ich hoffe mir kann wer helfen mit wenig aufwand. den ich sollte nur das nehmen, was ich auch schon kann 😉

Beste Grüße

799 Beiträge seit 2007
vor 13 Jahren

Das scheint mir nicht sehr sinnvoll.

In der Form-Klasse solltest du auf die Spieler zugreifen und auch innerhalb dieser Klasse beim Feuern des Button-Events das Label aktualisieren.

Ich weiß ja nicht, wie die Form-Klasse aussieht und wofür Spieler gut ist, aber im Endeffekt sollte der Button beim Click entscheiden können welcher Spieler hergezogen werden sollte um das Label upzudaten.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
M
manuzi1 Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

es sollte im endeffekt darauf hinaus laufen, dass wenn ich auf den button klick, er in die spieler klasse reingeht und eben LabelAktualisieren(); aufruft und dann ausgibt.

hier die spieler.cs komplett:

    class Spieler
    {
        public string Name;
        public int Geld;
        public RadioButton MeinRadioButton;
        public Label MeinLabel;

        public void LabelAktualisieren()
        {

            
        }
}

nichts großartiges. er meinte (weil wir damit noch nichts gemacht haben), dass wir

public RadioButton MeinRadioButton;
public Label MeinLabel;

benutzen können aber nicht müssen. für mich stehen die zwei oben genannten einfach für einen rb und ein label 🤔

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo manuzi1,

es ist nicht gerade die nette Art die Labels und Radiobuttons in die Spielerklasse zu platzieren.

Aber das ist momentan wohl zweitrangig.

Also kurz gesagt kannst du in deinem Array mit [0] auf ein spezifisches Element im Array zugreifen (in diesem Fall also auf Spieler 0)

Auf dieses Objekt kannst du dann deine LabelAktualisieren-Methode aufrufen.

Hier ein Beispiel


//Ruft die LabelAktualisieren-methode vom spieler auf dem Index 0 auf
spieler[0].LabelAktualisieren();

Aber IMHO ist es besser wenn du dir mal die Grundlagen erlernst, dafür gibt es sehr schöne Open Books. Guckst du hier: 🛈 📗 oder die MSDN :rtfm:

Bitte beachte [Hinweis] Wie poste ich richtig? 1.1.1 denn solche Dinge setzen wir hier schon als Grundlagen voraus

Gruss
Michael

157 Beiträge seit 2008
vor 13 Jahren

Wie michlG schon sagte, ist es nicht gut, die Controls in der Spielerklasse zu halten. Wie genau ist denn deine Form aufgebaut? Gibt es für jeden Spieler einen eigenen Button oder einen einzelnen, der nach Kriterien auf verschiedene Spieler zugreift? Die einfachste Lösung wäre wohl, LabelAktualisieren den Text zurückgeben zu lassen, den du dem Label zuweisen willst.


public string LabelAktualisieren()
{
    return this.Name + this.Geld;
}

private void OnClick(..)
{
    this.label = spieler[0].LabelAktualisieren();
}

Grundsätzlich ist es schlechter Stil, wenn man Daten (Spieler) und Darstellung (Form) zusammenschmeißt.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo manuzi1,

ich zitiere mal aus [FAQ] Kommunikation von 2 Forms.

Wenn es mit deiner Herangehensweise nicht funktioniert, kann das auch daran liegen, dass deine Herangehensweise ungünstig oder ungeeignet ist. In diesem Fall solltest du dich besser auf einen der beschriebenen Ansätze einlassen.

Genau das ist hier der Fall. Die anderen haben schon näheres zur Trennung von Modell und GUI gesagt. Du solltest du sicherstellen, dass du in der Klasse an keiner Stelle System.Windows.Forms verwendest. Wenn sich in der Klasse etwas änderst, von dem du denkst, dass es eine relevante Änderung ist, die im GUI zu einer Aktualisierung der Anzeige führen könnte/müsste, dann feuere an dieser Stelle ein Event ([FAQ] Eigenen Event definieren), dass das GUI dann abonnieren und behandeln kann. Steht aber alles in der FAQ.

was tun, wenn dir alle diese Infos und auch die Forumssuche nach Form1 Form2 noch nicht geholfen hat?

Bitte mach keinen neuen Thread auf, denn:

Siehe auch [FAQ] Wie finde ich den Einstieg in C#?

herbivore

Thema geschlossen