Forum: PC-Programmierung Daten zwischen Klassen austauschen (C#)


von ben91 (Gast)


Lesenswert?

Hallo liebe Foren-Mitglieder!

Ums es vorweg zu nehmen:
JA, ich bin ein Anfänger im Programmieren mit C# (bzw. OOP) und
JA, ich hab bereits mit bestem Wissen & Gewissen die Suchfunktion von 
Google verwendet, habe aber dennoch keine spezifische Problemlösung 
gefunden, welche bisher funktionierte :-(

Die Problemstellung ist an und für sich relativ einfach:

Ich möchte eine Variable "x", des Typs "String" mit dem Inhalt "Hallo" 
in FORM1, auch für FORM2 zugänglich machen,
sodass ich deren Inhalt beispielsweise in einer Textbox ausgeben oder 
sonst weiterverarbeiten kann.

Ist dies in einer OOP denn überhaupt möglich?

Meine Idee war anfangs, eine eigene Klasse zu generieren,
die eine "globale" Variable (public string x = null;) enthält,
von der aus ich beliebige Objekte abspalten kann, um dann auf die 
Variable "x" zugreifen zu können.
Dummerweise kann ich dann aber immer nur denn Wert "null" auslesen :-S

Was gibt es da denn für Möglichkeiten um dies zu realisieren?!


Vielen dank bereits im Voraus!!

von Peter II (Gast)


Lesenswert?

du musst erstmal überlegen zu was dein String gehört. Wenn er zu Form1 
gehört muss er dort rein, Wenn er zu form2 gehört muss er zu form2. Wenn 
er aber zu deiner Anwendung gehört dann muss er in die Klasse der 
anwendung. Die Formulare können dann auf die Anwendung die ja global ist 
zugreifen oder du musst sie beim konstruktor der Form mit übergeben.

von asdsdfsdf (Gast)


Lesenswert?

eine variable die waehrend der komplette laufzeit zu verfuegung stehen 
soll, braucht das schluesselwort "static"

so koenntest du eine globale instanz folgender art erstellen:

public static class Globals
{
 public static string BitteGebeDeinenVariablenGescheiteNamenUndNichtX = 
"affe'
}

von ben91 (Gast)


Lesenswert?

Hallo PeterII!

Ich habe einen String, der in FORM1 Daten zur Verfügung stellt
und nun in einer Textbox, in FORM2 ausgegeben werden soll.

Dazu habe ich bisher versucht, das ganze mit einer Property global 
zugänglich zu machen, wobei ich nur die default-Einstellungen der 
Variable auslesen konnte
1
public partial class Form1 : Form
2
{
3
     private string x = null;
4
5
     public string global_x
6
     {
7
          get { return this.x; }
8
          set { this.x = value;}
9
     }
10
}
11
12
public partial class Form2 : Form
13
{
14
     Form1 x_objekt = new Form1();
15
     textBoxTest.Text = x_objekt.global_x;
16
}

... auf der Textbox wird "null" ausgegeben :-(

von nocheinGast (Gast)


Lesenswert?

Kein Wunder, in deinem Codeausschnitt weist du der Variablen ja auch nur 
den Wert null zu und nichts anderes.

von asdsdfsdf (Gast)


Lesenswert?

und was sollte sie sonst ausgeben?

von Raik_C (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

ben91 schrieb:

> ... auf der Textbox wird "null" ausgegeben :-(

Und was hast du statt dessen erwartet.

public partial class Form2 : Form
{

Wenn die Form2 erzeugt wird, dann läuft diese Funktion

     Form1 x_objekt = new Form1();

diese Funktion erzeugt sich sofort erst mal eine neue Form1

Das heist, ein neues Form1 Objekt wird erzeugt und diese Form1 erzeugt 
sich

public partial class Form1 : Form
{
     private string x = null;


einen neuen String x, der erst mal auf null gesetzt wird.

Weiter geht es in der Form2, in der Konstruktorfunktion

     textBoxTest.Text = x_objekt.global_x;

von diesem neuen Form1 Objekt fragst du das global_x Member ab. Das ist 
aber klarerweise immer noch null, denn in der Zwischenzeit hat da ja 
keiner was reingeschrieben.


Also: Warum erwartest du, dass du da etwas anderes zurück bekommst?

von Ben91 (Gast)


Lesenswert?

Tut mir leid, hab ne (entscheidende) Code-Zeile vergessen:

nach "private String x = null;"

... käme noch "x = textboxBoxClass1.Text;" (allerdings in einem 
Unterprogramm verschachtelt)

Wobei stattdessen  lediglich "null" ausgegeben wird :-/

von Karl H. (kbuchegg)


Lesenswert?

Ben91 schrieb:
> Tut mir leid, hab ne (entscheidende) Code-Zeile vergessen:
>
> nach "private String x = null;"
>
> ... käme noch "x = textboxBoxClass1.Text;" (allerdings in einem
> Unterprogramm verschachtelt)

Wo kommt das?
Und wie soll dieses 'Unterprogram' bei der Erzeugung des Form1 Objektes 
aufgerufen werden?

von nocheinGast (Gast)


Lesenswert?

Ich glaub, du meinst, wenn du einmal eine Zuweisung machst, dass dann 
die Variable für immer an die Textbox gebunden ist. Das stimmt so 
nicht... wenn du den Wert der Variablen aktualisierst, dann ändert sich 
der Inhalt der Textbox noch lange nicht.
Das nennt sich "Data Binding", aber das ist noch etwas komplizierter. Du 
musst nach dem Unterprogrammaufruf noch mal eine Zuweisung 
"textBoxTest.Text = x_objekt.global_x;" machen.

von ben91 (Gast)


Lesenswert?

Erstmal guten Morgen!

Danke für die vielen Hilfestellungen (auf die ich jetzt leider nicht 
alle individuell eingehen kann :-/ )

@"nocheinGast": ja du hast recht, ich hab das "data binding" noch nicht 
so ganz im Griff :-(

Ich hab jetzt mal ein kleines Testprogramm geschrieben,
damit ich mich zuerst auf das wesentliche konzentrieren kann (ohne 
GUI,...)

Ziel war es, den Inhalt der Variable "i" aus dem "Unterprogramm" 
(bezeichnet man sowas in der OOP denn eigentlich auch als 
Unterprogramm?) in der Klasse "Program" auf der Console auszugeben.
Gibt es da denn auch ne Möglichkeit, das ganze ohne "return" im UP zu 
realisieren?

[c]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*--------*/using System.Text.RegularExpressions;

namespace Uebungen
{
    class Program
    {
        static void Main(string[] args)
        {
            meineKlasse meinObjekt = new meineKlasse();
            Console.WriteLine(meinObjekt.Name);
            Console.ReadKey();
        }
    }

    public class meineKlasse
    {
        private int i = 0;

        public int Name
        {
            get { return this.Unterprogramm(); }
          //  set { this.Unterprogramm = value; }
        }

        private int Unterprogramm()
        {
            i = 5;

            return i;
        }
    }
}
[c/]

Vielen dank für eure Hilfe!

von ben91 (Gast)


Lesenswert?

Keiner will helfen?

von Arc N. (arc)


Lesenswert?

ben91 schrieb:
> Keiner will helfen?

Nicht zu der Uhrzeit ;-)

Properties sind schon ok
1
class TestClass {
2
   private int aValue = 12345;
3
4
   public int Value {
5
       get { return aValue; }
6
       set { aValue = value; }
7
   }
8
9
   // für letzteres gibt's noch die Kurzform
10
   public int Value { get; set; }
11
}

> Gibt es da denn auch ne Möglichkeit, das ganze ohne "return" im UP zu
> realisieren?

Was soll das werden bzw. s.o.

von nocheinGast (Gast)


Lesenswert?

> Gibt es da denn auch ne Möglichkeit, das ganze ohne "return" im UP zu
> realisieren?
Kommt drauf an, welche C#-Version du benutzt... vielleicht kennt sie 
schon "automatic properties". Dann schreibst du das einfach so:
1
public int Value { get; set; }
Der Backing Store wird dabei implizit miterzeugt, du hast allerdings 
keinen direkten Zugriff darauf. Deswegen bei Properties, die nach außen 
read-only sein sollen, den Setter private machen und nicht weglassen:
1
public int Value { get; private set; }

von nocheinGast (Gast)


Lesenswert?

Ach entschuldigung, das muss an der Sonne liegen (oder an meinem 
F5-Knopf). :(
Arc Net hat die Frage natürlich schon beantwortet.

von löffel (Gast)


Lesenswert?

public staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpfdsublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpfbublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic stati 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic statiticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic  staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic icpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic staticpublic 
staticpublic staticpublic staticpublic staticpublic static

von Jonas B. (jibi)


Lesenswert?

>Ich möchte eine Variable "x", des Typs "String" mit dem Inhalt "Hallo"
>in FORM1, auch für FORM2 zugänglich machen.

Dann erzeugst du FORM1 in einer Methode von FORM2. Dann kannst du dieser 
beim Erzeugen auch einen Wert mitgeben, oder setzen.

z.B.

public void createForm2(string x)
{
  Form2 Windos...Form = new Windos...Form();
  Form2.x.Text = x;
}

Gruß Jonas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.