Autor Beitrag
blutengel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 12.08.12 10:43 
Hi,

ich hab da ein Problem. Und zwar habe ich eine Windows Forms Anwendung mit 2 Forms, und dazu noch eine Klassenbibliothek.
In der Klassenbibliothek habe ich mit:

ausblenden C#-Quelltext
1:
public int port;					


eine Variable deklariert. Von der 2 Form aus kann ich darauf zugreifen und auch Werte in sie hineinspeichern. Sobald ich mir die Werte aber in der Haupform holen will geht das nicht. Der Inhalt ist weg und in der Variablen steht NULL. Was mache ich da falsch, wieso verschwindet der Inhalt wenn ich ihn reingeschrieben habe?


MFG

blutengel


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am So 12.08.2012 um 12:04
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 12.08.12 11:04 
Hallo!

Die Variable steht ja sicherlich noch in irgendeiner Klasse, die Du instanziert hast. Diese Instanz musst Du zwischen den Forms austauschen.

Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 12.08.12 11:45 
In einer Variable vom Typ int steht null?
Das kann nicht sein, hast du vielleicht int? oder einen anderen Typ?


Und wie gibst du die Variable denn weiter?
Das sollte ja eigentlich ganz einfach sein, entweder über den Konstruktor oder über eine Eigenschaft.
blutengel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59

Win XP, WIN 7
VS#2008 Prof
BeitragVerfasst: So 12.08.12 13:50 
Sorry eigentlich sollte es heißen:

ausblenden C#-Quelltext
1:
public string port					


von meiner 2. Form kann ich ja auch zugreifen, und laut Debugger steht auch das Richtige in der Variablen drin.

hier mal die Klasse:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace options
{
    public class einstellungen
    {

        public string port;
        public int baud;

    }
}


Zugänglich machen ich das in beiden Forms mit:

ausblenden C#-Quelltext
1:
 einstellungen o_einstellungen = new einstellungen();					


Sobald ich jetzt in einer der Forms z.B.:
ausblenden C#-Quelltext
1:
o_einstellungen.baud = 9600;					


schreibe, kann ich darauf zugreifen und der Variablen einen Wert zuweisen.

versuche ich aber auch einer anderen Form den Wert auszulesen steht entweder nichts oder 0 darin.

z.B. so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Convert.ToString(o_einstellungen.baud));
            
            

        }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 12.08.12 14:13 
Hallo blutengel,

wenn du in beiden Forms
ausblenden C#-Quelltext
1:
einstellungen o_einstellungen = new einstellungen();					

verwendest (btw. Klassennamen sollten einen großen Anfangsbuchstaben tragen), so ist ja klar, daß du dann zwei unterschiedliche Instanzen erzeugst.
So wie Christian und Palladin700 schon geschrieben haben, gebe einfach die Referenz an die andere Klasse weiter. Du kannst dir dafür auch mal meinen (schon oft verlinkten) Artikel Kommunikation von 2 Forms durchlesen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 12.08.12 14:50 
Ich hab mir den Artikel zwar nicht durchgelesen (Schande über mich ^^) aber das Stichwort Eigenschaft dürfte dein Problem ganz einfach lösen.

Zum Thema Referenz an die andere Klasse weiter geben, hier ein Beispiel:

Du überlädst ihn einfach mit dem Parameter von Typ einstellung. Da das ein Referenz-Typ ist, kannst du dann von beiden Forms darauf zugreifen und die Änderung wird immer in beiden aktuell sein.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
class Form2 : Form
{
    private einstellung o_einstellungen;

    public Form2(einstellung o_einstellungen)
        : this()
    {
        // Referenz auf Gültigkeit prüfen
        this.einstellungen = einstellungen;
    }
}


Oder du verlangst im Konstruktor nur speziell nach der einer Variable vom Typ einer der Eigenschaften von einstellung. int und string sind keine Referenz-Typen, daher wird sich die Änderung nicht in der ursprünglichen Referenz von einstellung aktualisieren, aber wenn das nicht zwingend nötig ist, lasse ich es auch immer.

Diese Möglichkeit sollten für deinen Fall völlig ausreichen.

Ich gebe eine Referenz nur dann an eine zweite Form oder Klasse weiter, wenn ich das auch wirklich brauche.
Wenn das nicht zwingend nötig ist, dann arbeite ich lieber mit Eigenschaften, die ganz speziell das heraus geben, was ich brauche, denn dann kann ich direkt überwachen, was genau mit der Eigenschaft geschieht.


PS: Deinen Artikel schaue ich mir mal an, Th69, was neues zu lernen, schadet nie. ^^

PS²: Hab mir den Artikel jetzt mal durchgelesen und ich muss sagen, es lohnt sich. ^^
blutengel, kannst dir also ruhig die Zeit nehmen.