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
 

Saber

Erfahrenes Mitglied
Richtig, das geht in C#.NET nicht auf diese Art und Weise. Du kannst per using lediglich Namespaces einbinden, aber keine Klassen oder Objekte.

Außerdem gibt es nur eine Klasse für DataSets. Wenn Du ein neues DataSet erstellt stimmen die Typen auf Form1 und Form2 überein. Du musst also nicht irgendwie ein spezielles DataSet vom Typ des Form1-DataSets erstellen.
Einfach so:
Code:
// In Form 1
DataSet ds = new DataSet();

// In Form 2
DataSet ds = new DataSet();
Die Übergabe kannst Du über den Konstruktor machen, dann kannst Du auch eine Referenz benutzen
Code:
// In Form 1
Form2 frm = new Form2(ref ds);


// In Form 2

DataSet m_Ds;
public Form2(ref DataSet ds)
{
   m_Ds = ds;
}

private void IrgendeineMethode()
{
   m_Ds.Tables[0] ... blablabla
}
Über die Referenz (ref) arbeitest Du praktisch DIREKT mit den Daten im DataSet aus Form1. Ohne das Wörtchen "ref" würde er Dir eine lokale Kopie in Form2 erstellen.

Hmm ... ich glaub ich hör jetzt auch ... ich verwirr mich ja schon selber. *fg* ;)
 

flaavia

Mitglied
:) :)

Vielen herzlichen Dank

Jetzt ist mir vieles klarer

Hmm ... ich glaub ich hör jetzt auch ... ich verwirr mich ja schon selber. *fg*
:) :) :) ;)

*fg*

PS:

ist das Präfix m_ eine übliche Kennzeichnung von gekapselten (privaten) Variablen in einer Klasse? Ich habe dies sonst mit m_ noch nirgends gesehen.
Wofür steht denn das m_ ?

*fg*
 
Zuletzt bearbeitet:

Saber

Erfahrenes Mitglied
Korrekt, das "m" steht für Membervariable ... das hab ich aus meiner C++ Zeit übernommen. Kann man machen, muss man aber nicht. Es gibt Leute die setzen vor jeden String ein "s" oder ein "str" etc. Muss jeder selber wissen wie er/sie das handhabt. :)