C# Label aus anderer class ändern

Lkjhgf Lkijhgfd

Grünschnabel
Hi,
ich will den text eines labels aus der main function heraus ändern aber bekomme immer nen error. Wie kann man folgenden Code zum laufen bringen? Th!




PHP:
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string Label1Value
        {
            get { return this.label1.Text; }
            set { this.label1.Text = value; }
        }

        public void qwertz()
        {
            Label1Value = "Label1Value";
        }
    }
    public partial class class1 : Form
    {
       


        private void button1_Click(object sender, EventArgs e)
        {
            Form1.qwertz();
        }

    }
}
 

Shakie

Erfahrenes Mitglied
Bitte immer Fehlermeldung mit angeben, sonst können andere Leute auch nur raten, was das Problem ist.
Ich rate hier, dass du zuerst eine Instanz der Klasse "Form1" erstellen musst, bevor du auf dessen "qwertz"-Methode zugreifen kannst.
 

Lkjhgf Lkijhgfd

Grünschnabel
Der Error ist: Error 1 An object reference is required for the non-static field, method, or property 'WindowsFormsApplication1.Form1.qwertz()'
 

warcraft9105

Erfahrenes Mitglied
Hallo,

als erstes musst du die Methode "qwertz" statisch machen.
Dass du dann in dieser auf das Label zugreifen musst brauchst du eine Referenz auf das aktuelle Form1-Objekt:
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static Form1 Form1Instance = null;
        public Form1()
        {
            InitializeComponent();
            Form1.Form1Instance = this;
        }

        public string Label1Value
        {
            get { return this.label1.Text; }
            set { this.label1.Text = value; }
        }

        public static void qwertz()
        {
            Form1.Form1Instance.Label1Value = "Label1Value";
        }
    }
    public partial class class1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Form1.Form1Instance.qwertz();
        }
    }
}

Hoffe es funktioniert. Habs nicht getestet. Müsste aber so funktionieren.

Gruß,
warcraft9105
 
Zuletzt bearbeitet:

RudolfG

Erfahrenes Mitglied
\sry verlesen ^^

Nachdem ich den Betrag genauer durchgelesen habe, hier eine hoffentlich vernünftigere Antwort :D

als erstes musst du die Methode "qwertz" statisch machen.

Das ist überhaupt nicht notwendig. Er muss nur eine Instanz der Klasse Form1 erstellen. Was bereits mehrfach in diesem Thread erwähnt wurde.

z. B. so:

C#:
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 WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
        } 

        public string Label1Value 
        { 
            get { return this.label1.Text; } 
            set { this.label1.Text = value; } 
        } 

        public void qwertz() 
        { 
            Label1Value = "Label1Value"; 
        } 
    } 
    public partial class class1 : Form 
    { 
        


        private void button1_Click(object sender, EventArgs e) 
        { 
            Form1 f = new Form1();
            f.qwertz(); 
        } 

    } 
}

Aber den Sinn dahinter verstehe ich nicht ganz. Es währe schön wenn du (Lkjhgf Lkijhgfd) erstmal kurz erklären könntest was genau du machen möchtest?
 
Zuletzt bearbeitet:

warcraft9105

Erfahrenes Mitglied
@RudolfG
Ich denke, dass er die aktuelle Form bzw. das Label ändern möchte, also den Text. Und das aus einer anderen Klasse heraus.
Wenn das so der Fall ist, wovon ich ausgehe, geht das mit meiner dargestellten Lösung.
Wäre schön, wenn der TE sich über sein Vorhaben nochmal genauer äußern würde.

Gruß,
warcraft9105
 

Shakie

Erfahrenes Mitglied
Ich muss rudolfG zustimmen: die Methode statisch zu machen ist kein schöner Programmierstil; es ist auch gar nicht notwendig. Außerdem wäre das nur eine Quelle für Fehler: wenn man zwei Instanzen der Klasse "Form1" hat, dann ändert die statische qwertz-Methode immer den Inhalt des Labels der zuletzt erstellten Instanz. Falls das nicht so gewollt ist, dann sollte man hier keine statische Methode verwenden.
@Lkjhgf Lkijhgfd: funktionert obiger Code für dich?
 

Lkjhgf Lkijhgfd

Grünschnabel
So, danke für die Antworten, bin leider erst eben dazugekommen den Code zu testen.
@RudolfG Das soll so eine Art Ladebalken werden wo alle x seks der Text eines Labels geändert wird... Der Code hat zwar keinen Error aber der Text ändert sich leider trotzdem nicht....

Bei warcraft9105 s Code kommt folgender Error:

Error 1 Member 'WindowsFormsApplication1.Form1.qwertz()' cannot be accessed with an instance reference; qualify it with a type name instead.

Und wenn ich das ".FormInstance" aus der Button1_Click lösche wird Zwar kein Error mehr angezeigt aber das Label wechselt auch wieder nicht den Text...
 
Zuletzt bearbeitet:

RudolfG

Erfahrenes Mitglied
@RudolfG Das soll so eine Art Ladebalken werden wo alle x seks der Text eines Labels geändert wird...

Achso. :D

Hier kann man das entweder über Events (Benachrichtigungen) oder über eine etwas "leichtere" Möglichkeit lösen.

Hier findest du mehr informationen zu den Events: http://openbook.galileocomputing.de/csharp/kap23.htm

Ggf. solltest du im Internet auch noch anderen Quellen und Erklärungen zum Thema "Events" und/oder "Ereignisse" durchlesen.

Der Einfachheitshalber würde ich das wie folgt machen:

C#:
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 WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
        } 

        public string Label1Value 
        { 
            get { return this.label1.Text; } 
            set { this.label1.Text = value; } 
        } 

        public void qwertz() 
        { 
            Label1Value = "Label1Value"; 
        } 
    } 

   public partial class class1: Form
   {
      // Das meinten wir die ganze Zeit: "Instanz erstellen"
      private Form1 m_pForm = new Form1();

      public class1(): base()
      {
      }

      // Irgendwo z. B. musst du diese Funktion aufrufen
      private void ShowProgressWin()
      {
         m_pForm.Show();
      }
      
      private void button1_Click(object sender, EventArgs e) 
      { 
          m_pForm.qwertz(); 
      } 
   }
}

Diesen Teil habe ich nicht kompiliert und kann somit noch Syntax-Fehler beinhalten.

Ich habe mir mal ein kleines Test-Programm für dein Problem geschrieben, das ich dem Betrag anhänge. Du kannst ja bei Unklarheiten gerne in den beiliegenden Quelltext gucken oder das Test-Programm ausführen :D

Gruß
RudolfG
 

Anhänge

  • WindowsFormsApplication1.zip
    44,9 KB · Aufrufe: 103