Übergabe von Strukturen zwischen 2 Window-Forms

Hi WWWler
Ich habe ein (Anfänger-)Problem ich habe eine Struktur, und 2 Window-Forms.
Im ersten Form wird die Struktur gefüllt, und nun möchte ich im 2. Form auf die Struktur zugreifen.
Leider sind meine Versuche bisher fehlgeschlagen, und ich komme von selber nicht weiter. Ich hoffe ihr könnt mir helfen.
Hier ein paar Codeschnipsel:
(Ich verwende .NET 2.0)

namespace xyz
{
public struct MyStruct
{
public int count;
public string name;
}

public partial class Form_myForm1 : Form
{
MyStruct[] struktur = new MyStruct[50];

public Form_myForm1()
{
InitializeComponent();
}
public myFunction()
{
//hier wird dann irgendwie ‚struktur‘ gefüllt
}
}

public partial class Form_myForm2 : Form
{
public Form_myForm2()
{
InitializeComponent();
}

private void myFunction2()
{
//hier will ich dann auf den Inhalt von ‚sruktur‘ zugreifen
}
}
}

Gruß Wizard of War

Hallo Wizard of War,

sofern dieerste Form existent bleibt, das zweite quasi darüber liegt:
In der ersten Form deklarieren:

public static MyStruct[] struktur = new MyStruct[50];

Über
Form_myForm1.struktur
dann kannst du so aus der zweiten Form auf die Var zugreifen.

Alternativ kannst du in der zweiten Klasse eine Var als public deklarieren und diese nach dem Instanzieren (in der ersten Form) füllen.

Entscheidend ist der Ablauf. Bleibt Form_myForm1 im Hintergrund offen, ist die erste Variante sicher die beste. Ich verwende das so, um Einstellungen des Users aus der Startmaske in den notwendigen folgenden Dialogen zu verwenden. Diese fallen aber alle am Ende in die Startmaske zurück.

mfg

Dirk.Pegasus

Hallo Dirk!

Hallo Wizard of War,

sofern dieerste Form existent bleibt, das zweite quasi darüber
liegt:
In der ersten Form deklarieren:

public static MyStruct[] struktur = new MyStruct[50];

Wieso static?

Über
Form_myForm1.struktur
dann kannst du so aus der zweiten Form auf die Var zugreifen.

Alternativ kannst du in der zweiten Klasse eine Var als public
deklarieren und diese nach dem Instanzieren (in der ersten
Form) füllen.

Entscheidend ist der Ablauf. Bleibt Form_myForm1 im
Hintergrund offen, ist die erste Variante sicher die beste.

Das hat nichts mit „offen bleiben“ zu tun.
Die Zugreifbarkeit auf das Struct-Array hängt nur am Vorhandensein der Instanz von Form1, egal, ob sichtbar oder nicht…

Ich verwende das so, um Einstellungen des Users aus der
Startmaske in den notwendigen folgenden Dialogen zu verwenden.
Diese fallen aber alle am Ende in die Startmaske zurück.

mfg

Dirk.Pegasus

Gruß,
Martin

Hallo Martin,

Wieso static?

weil ein einfaches public nicht reicht muss es static sein (hab doch c# auch nicht entwickelt …). Man will ja in das aufrufende Object schauen und nicht eine Eigenschaft eines instanzierten Objektes füllen.

Das hat nichts mit „offen bleiben“ zu tun.
Die Zugreifbarkeit auf das Struct-Array hängt nur am
Vorhandensein der Instanz von Form1, egal, ob sichtbar oder
nicht…

Klar, aber ich wollte damit auch nur sagen, dass die aufrufende Instanz noch existieren muss. (Geht auch garnicht anders)

mfg

Dirk.Pegasus

Hallo!

Damit Du von Form_myForm2 aus auf irgendeine Eigenschaft einer Instanz von Form_myForm1 zugreifen kannst, musst Du einerseits die betreffende Instanz kennen und die Eigenschaft (in Deinem Fall „struktur“) muss für Form_myForm2 sichtbar sein.
Letzteres ist bei Dir so schon gegeben: Du hast für struktur keinen Zugriffsmodifikation angegeben (wie private, protected usw.), damit ist „struktur“ erst mal „internal“ (also nur innerhalb der selben Assembly sichtbar wie die definierende Klasse Form_myForm1).

In Form_myForm2 brauchst Du dann noch eine Instanz von Form_myForm1, auf deren struktur-Array Du zugreifen willst. Es kann ja viele Instanzen von Form_myForm1 geben, welche soll’s denn sein?
Entweder, Du gibst die Instanz beim Methodenaufruf mit (also über „private void myFunction2(Form_myForm1 theForm1)“) oder Du setzt Dir die betreffende Instanz in ein Property von Form_myForm2 und nimmst dann diesen Wert.

Häufig wird es auch so gelöst, dass das eigentliche Arbeiten mit den Daten in eine eigene Klasse (oft „…Manager“ oder „…Controller“ genannt) ausgelagert wird. Damit sorgt dann nicht Form_myForm2 selbst dafür, an die Daten von Form_myForm1 zu kommen, sondern eine Controller-Klasse erledigt das. Dies harmoniert prima mit der Übergabe der Instanz beim Methodenaufruf.
Du kannst ja mal nach dem Stichwort „Kopplung“ googlen, um die Minimierung derselben geht es nämlich dabei.

Der Vorschlag von dirk.pegasus, mit einem statischen Attribut zu arbeiten, macht nur dann Sinn, wenn „struktur“ für alle Instanzen von Form_myForm1 gleich sein soll. Ob das so sein soll, kannst nur Du entscheiden, ich bezweifle es aber. Ich möchte nicht, dass sich hier schlechter Stil einschleicht - bei Anfängern besonders wichtig :smile:

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Dirk,

vielen Dank!
Ich bin wirklich doof.
Logisch, daß der die instanz net sehen kann…

Vielen Dank für die Hilfe!

Und auch danke an Martin!

Das mit der kapselung in ner Klasse hatte ich auch überlegt, allerdings ist struct recht groß, und da für jedes Element ne eigene get/set-Methode zu schreiben, da war ich zu faul für *g*

Vielen Dank nochmal für die schnelle Hilfe!

Gruß Wizard of War

Hallo Martin,

vielen Dank für die ausführliche Antwort!

Das mit der nicht public instanz war doof, hab das absolut net gesehen…

Zum Thema Kapselung in ner Klasse: hatte ich auch mal überlegt, aber die sruct ist recht groß und da war ich zu faul für jedes Element ne get/set-Methode zu schreiben :wink:

Ich hab die Instanz einfach public static gemacht und dann gings, reicht für mein Programm vollkommen aus.

Danke für die schnelle Hilfe!

Gruß Wizard of War