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!!
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.
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' }
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 :-(
Kein Wunder, in deinem Codeausschnitt weist du der Variablen ja auch nur den Wert null zu und nichts anderes.
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?
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 :-/
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?
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.
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!
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.
> 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; } |
Ach entschuldigung, das muss an der Sonne liegen (oder an meinem F5-Knopf). :( Arc Net hat die Frage natürlich schon beantwortet.
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.