Wie Instanz von Form1 (mit Main) von außerhalb ansprechen ?

flaavia

Mitglied
Hallo

Wenn ich mich innerhalb der Definition von Form1 (der Form mit Main() ) befinde beziehe ich mich ja auf die Instanz der Form1 mit:

this.

Wenn ich jetzt von außerhalb, also z.B. einer Form2 Elemente von Form1 ansprechen will, kann ich dies innerhalb von Form2 ja nicht mit this machen, da sich dies ja auf Form2 bezieht.

Wie geht das denn aber dann ?

vielen Dank für alle Tips:)
 

flaavia

Mitglied
Hallo Alexander


Könntest Du mir hierzu kurz die Syntax nennen:
wie ich die Referenz im Konstruktor übergeben muss (dürfte ja wahrscheinlich nur eine Zeile sein) und unter welchem Namen ich die Form1 dann in Form2 ansprechen kann.

Vielen herzlichen Dank
 

flaavia

Mitglied
Hallo Counterfeit

Aber erzeuge ich damit nicht eine komplett neue Instanz von Form1 ?
Eigentlich möchte ich ja nur Zugriff auf die bereits bestehende Form1 von der (aus Form1 aus erzeugten) Form2 aus.
 

Saber

Erfahrenes Mitglied
Original geschrieben von flaavia
Könntest Du mir hierzu kurz die Syntax nennen:
wie ich die Referenz im Konstruktor übergeben muss (dürfte ja wahrscheinlich nur eine Zeile sein) und unter welchem Namen ich die Form1 dann in Form2 ansprechen kann.

Der Konstruktor des Form2 muss in etwa so aussehen:
Code:
public Form2(Form1 frm)
{
   InitializeComponent();

   // Hier steht der Konstruktor-Code
}
In Form1 muss in der aufrufenden Methode dann der folgende Code stehen:
Code:
Form2 frm2 = new Form2(this);
frm2.Show();
Der Konstruktor von Form2 ist nur ein simples Beispiel. Man kann ihn auch wesentlich dynamischer schreiben, so dass man beispielsweise alle Forms übergeben könnte. Muss man dann eben casten, von Form nach Form1 etc. ;)
 

flaavia

Mitglied
Hallo Saber

Vielen Dank für den Tip

Ich habe statt der Form2 eine UserControl (ich habe die englische Version, ich glaube in der deutschen heißt das Windows-Steuerelement, müsste ja aber im code gleich sein) und habe Deinen Vorschlag dort mal versucht - aber eben mit UserControl anstatt Form2. in Form1:

Code:
UserControl1 user1 = new UserControl1(this);


und im Konstruktor von UcerControl1:

Code:
public UserControl1(Form1 frm)
		{
			// This call is required by the Windows.Forms Form Designer.
			InitializeComponent();

			// TODO: Add any initialization after the InitializeComponent call

		}


Leider bekomme ich die Fehlermeldung in Bezug auf this:

...\Visual Studio Projects\Beispiel\Form1.cs(26): Keyword this is not available in the current context

Was habe ich denn da falsch gemacht - oder geht das bei UserControls nicht ?

PS:
ich hatte zuerst: UserControl1 user1 = new UserControl1(this);

direkt unter class stehen, bevor Form1 instanziiert war, nachdem ich user1 dort nur deklariert habe und user1 erst nach Aufruf von:

Application.Run(new Form1());

instanziert habe, scheint es zu gehen, zumindest ohne Fehlermeldung.

Vielen Dank :) :)
 
Zuletzt bearbeitet:

flaavia

Mitglied
Hallo

Noch ein Problem:

Jetzt kann ich zwar von Form2 (und auch UserControlX) aus alle public properties und methods "sehen" (Intellisence zeigt diese zur Auswahl an), aber wenn ich ein DataGrid auf Form2 lege und in den Eigenschaften des Datagrids DataSource und DataMember auswählen will, ist das auf Form1 angelegte DataSet dort nicht aufgeführt - obwohl in Form2 Intellisence (wenn man schreibt: Form1. ) das Dataset mit anzeigt.


Was kann ich denn machen, daß das DataSet auf (Form 1) in den Eigenschaften eines DataGrid auf Form2 unter DataSource / DataMember mit angezeigt wird und damit direkt auswählbar wird ?
 

Saber

Erfahrenes Mitglied
Du spricht das DataSet aber schon in der Form an, oder?
Code:
Form2DataSet = Form1.Form1DataSet;
 

flaavia

Mitglied
Naja, ...

Ich war mir nicht klar, ob ich das tun muß. Unter Delphi reicht es nämlich, die Fom1 unter uses (analog using) einzubinden und dann das Dataset über Form1.Form1DataSet in Form2 direkt anzusprechen.
Aus Deiner Anwort entnehme ich, daß dies in C# nicht geht - oder?
Ich muß also auf Form2 ein Dataset Form2Dataset (vom Typ des Form1Dataset) zumindest deklarieren (instanziieren brauche ich es ja nicht explizit, wenn ich dann später Form1DataSet übergebe - oder?)

und übergebe dann
Code:
Form2DataSet = Form1.Form1DataSet;

im Konstruktor von Form2 - oder wo macht man diese Zuweisung am besten?

Wobei - in diesem Konstruktor wird ja auch Form1 erst zugewiesen. Muß dann diese Zuweisung von Form 1 als erstes erfolgen und dann die von Form1DataSet (weil dazu muß Form1 in Form2 ja schon definiert sein)

Oder geht alles vielleicht doch noch ganz anders
 

Neue Beiträge