C# Text von Label aus anderer Form ändern

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
594
hallo zusammen

ich habe ein ganz einfaches Problem - oder ich denke es ist es.
Ich habe es auch schon einmal so gemacht, aber ich komme einfach nicht mehr darauf - und es eilt ziemlich mit dem Programm..


Ich schreibe gerade ein kleines Programm zum Zählen von Spielständen an einer Veranstaltung. es hat zwei teams und die Resultate sollen in Echtzeit mit einem Beamer sichbtar gemacht werden.

dazu habe ich zwei Forms gemacht, eines mit den Button zum hochzählen des Spielstands (Team 1 +, Team 2 +) usw. in der Zweiten Form habe ich zwei Labels, welche den Spielstand anzeigen sollen.

Ich möchte daher mit klick auf den btnTeam1Plus, dass das Label lblTeam1 in der FormAnzeige den Text ändern.

Dass man Variabeln mit get und set weitergeben kann usw. weiss ich. Ich habe schon einmal etwas ähnliches gemacht aber komme auf die Schnelle nicht mehr darauf..


lange rede kurzer Sinn: wie ändere ich aus Form1 den text des Labels in FormAnzeige?

Hier wie es aussehen soll:



Hier der Text:

Form1:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Spielstandszaehler
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {

        }

        private void btnStartCount_Click(object sender, EventArgs e)
        {
            FormAnzeige FormAnzeige = new FormAnzeige();
            FormAnzeige.Show();
        }

        private void btnTeam1Plus_Click(object sender, EventArgs e)
        {

        }
    }
}

FormAnzeige:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Spielstandszaehler
{
    public partial class FormAnzeige : Form
    {

        public FormAnzeige()
        {
            InitializeComponent();
        }

        private void FormAnzeige_Load(object sender, EventArgs e)
        {
            
        }
    }
}
 
Zuletzt bearbeitet:
Einfach in FormMain eine Instanzvariable deklarieren, welcher du dann die FormAnzeige zuweiste. Anschließend kannst du dann auf alle öffentlichen Methoden/Properties der FormAnzeige zugreifen und somit auch die Werte der Anzeige setzen.
 
Zuletzt bearbeitet:
Ich verstehe Dein Problem nicht so ganz .. aber ich versuche mal was einzuwerfen:

Du hast hier zwei verschiedene Objekte (in Deinem Fall zwei Windows-Forms).

Wenn ich Dich richtig verstehe, möchtest Du in der einen Form (links) auf einen Button klicken, der dann den Spielstand, der in der rechten Form angezeigt werden soll, um eins in für das jeweilige Team erhöht?

Sollte das so sein, musst Du anderen Objekten (in Deinem Fall nur FormMain) nun irgendwie den Zugang zum Erhöhen der Spielstände im gewünschten Objekt (hier: FormAnzeige_Load) gewähren. Der erste Schritt ist Dir gelungen: Die Klasse des instanziierten Objektes ist "public" deklariert und jedes außenstehende Objekt kann es sehen - allerdings fehlen außenstehenden Objekten noch die Zugriffsmöglichkeiten über eine bestimmte "public" Methode - die letztendlich etwas bestimmtes ausführen soll.

Das kannst Du entweder so machen, wie es bEnnY' vorgeschlagen hat, oder Du baust Dir Deine eigenen Methoden (z.B. namens "erhoeheSpielstandTeam1()" und "erhoeheSpielstandTeam2()") - wichtig an dieser Stelle ist, dass der Spielstand im Objekt FormAnzeige_Load gespeichert ist (in einer Variablen), die von außen nicht direkt (kein public Zugriff auf Variable!) verändert werden kann.

Hoffe das hilft Dir weiter :-)
 
Nunja - genau dammi hat es erkannt. mit dem Klick links in der Form möchte ich in der rechten Form die Labels verändern..

wenn ich einfach eine Variabel übergebe muss ich jedesmal die Form neu öffnen, dass es übernommen wird. Edel wäre natürlich, wenn ich die Methode erhöheSpielstandteam1() in FormAnzeige aus FormMain ansprechen könnte.

Auch nach Google komme ich jedoch nicht ganz darauf, wie ich die Methode in FormAnzeige aus FormMain aufrufen kann.?

EDIT:

Ich habe es nun hingekriegt - keine Ahnung wiso.

Ich kann nun aus FormMain auf erhöheSpielStand1 zugreiffen.

Code:
        private void btnTeam1Plus_Click(object sender, EventArgs e)
        {
            FormAnzeige.erhöheSpielstand1(); 
        }

Jedoch, ich habe in FormAnzeige folgenden Code:

Code:
        public static void erhöheSpielstand1()
        {
            intStandTeam1++;
            lblTeam1.Text = Convert.ToString(intStandTeam1);
        }

Jedoch ergibt er mir den Fehler:

Für das nicht statische Feld, die Methode oder die Eigenschaft "Spielstandszaehler.FormAnzeige.lblTeam1" ist ein Objektverweis erforderlich.

EDIT2:
Es ist das UI - Problem - ich kann nicht auf das Label zugreiffen, da es im UI - Thread liegt.
Laut google ist ein Invoke notwendig - doch ich kriegs nicht hin?
 
Zuletzt bearbeitet:
Also Dir fehlen offensichtlich die grundlegendsten Grundlagen. Die solltest Du auf jeden Fall mal nachholen!

Zu Deinem Problem:
Warum ist Deine Methode "erhöheSpielstand1" als "static" deklariert?

Das Problem hierbei ist, dass es sich dadurch um eine "statische", also eine Klassenmethode handelt (es muss kein Objekt der Klasse existieren zum Aufruf dieser Methode)! Dementsprechend könntest Du diese Methode Aufrufen, OHNE das die Form existiert. Ergo würdest Du Probleme beim Zugriff auf das Label über " lblTeam1.Text = Convert.ToString(intStandTeam1);" bekommen - da das Label nur mit seinem Parent (der Form) existieren kann.

Und nochwas: Bitte keine Umlaute im Code :p
 
Zuletzt bearbeitet:
Das weiss ich. Ich bin auch kein Programmierer und habe auch nicht die Zeit c# von Grund auf zu lernen.

Ich hab mir nur ein wenig C# beigebracht, um ein paar kleinigkeiten zu erledigen. Ich kann ziemlich viele Programmiersprachen einfach ein wenig, für das meiste genügt es auch.
 
Unabhaengig von den Programmiersprachen ist es wichtig, dass Du den Unterschied zwischen einer Klasse und einem Objekt kennst .. und vorallem den Unterschied der Modifizierer.

Hast Du es hinbekommen?
 
Ich hab es noch nicht hinbekommen - aus Zeitgründen habe ich es mit einer Form realisiert
 
Code:
    public partial class FormMain : Form
    {
        //restlicher Code bleibt natürlich stehen, es werden die Methoden nur entsprechend bearbeitet 
        // und die hinzugefügte Zeile bei dir auch hinzugefügt ;)

        FormAnzeige anzeige;

        private void btnStartCount_Click(object sender, EventArgs e)
        {
            anzeige = new FormAnzeige();
            anzeige.Show();
        }

         private void btnTeam1Plus_Click(object sender, EventArgs e)
         {
               anzeige.erhöheSpielstand1();
         }

und das static bei der anderen Form überall weg ;)

Nochmal um es Fest zu halten:
Code:
//KlassenName   ObjektName
FormAnzeige   anzeige;  //definierung eines Objektes


anzeige = new FormAnzeige(); // erstellen(instanzieren) des Objektes

Dein Problem war :
Dass du das Objekt "FormAnzeige" genannt hast.
Objekten werden nie die selben namen gegeben wie der Klasse!! (böse böse!)

Dann hätte schon dein Visual studio gesagt das bei der Methode btnTeam1Plus das Objekt nicht gefunden werden kann.
Als Faustregel kannst du sagen das wenn du ein Objekt erstellst es nur so lange gültig ist bis die Klammern in denen du es definierst sich schließen.
Code:
private void btnStartCount_Click(object sender, EventArgs e)
{
     FormAnzeige anzeige = new FormAnzeige(); //definierung UND instanzierung des Objektes 
}
//jetzt kennt er anzeige nichtmehr

deswegen kam das
Code:
FormAnzeige anzeige;
Innerhalb der Klasse FormAnzeige und außerhalb der Methode hin.
Dann kann dein Objekt von der Klasse FormMain die FormAnzeige anzeige in jeder Methode benutzen. (insofern du sie instanziert hast oder ihr eine FormAnzeige zugewiesen hast)
 
Zuletzt bearbeitet von einem Moderator:
Das selbe Spielchen gibts auch umgekehrt:

In FormMain:
Code:
anzeige = new FormAnzeige([B]this[/B]);
anzeige.Show();

Und im Konstruktor von FormAnzeige:
Code:
FormMain mFormMain = null;

public FormAnzeige(FormMain f)
{
    InitializeComponent();
    mFormMain =f;
}

Dann kannst du von FormAnzeige aus auf FormMain zugreifen.
 
Zurück
Oben