tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
2034
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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
     

  2. #2
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Im Konstruktor deiner Form2 übergib einen Verweis auf Form1, damit kannst dann darauf zugreifen.

    Mfg,
    Alex
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  3. #3
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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
     

  4. #4
    Avatar von Konstantin Gross
    Konstantin Gross Konstantin Gross ist offline Mitglied Platin
    Registriert seit
    Sep 2003
    Ort
    nähe Kassel (Hessen)
    Beiträge
    703
    Form1 form1 = new Form1();
    form1.Show();

     
    Internetseite:
    http://www.texturenland.de

    Blog:
    http://blog.texturenland.de

    Codesnippets:
    .NET-Snippets

    - Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -

  5. #5
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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.
     

  6. #6
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    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 :
    1
    2
    3
    4
    5
    6
    
    public Form2(Form1 frm)
    {
       InitializeComponent();
     
       // Hier steht der Konstruktor-Code
    }
    In Form1 muss in der aufrufenden Methode dann der folgende Code stehen:
    Code :
    1
    2
    
    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.
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  7. #7
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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 :
    1
    
    UserControl1 user1 = new UserControl1(this);


    und im Konstruktor von UcerControl1:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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
    Geändert von flaavia (06.02.04 um 11:13 Uhr)
     

  8. #8
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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 ?
     

  9. #9
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    Du spricht das DataSet aber schon in der Form an, oder?
    Code :
    1
    
    Form2DataSet = Form1.Form1DataSet;
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  10. #10
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37
    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 :
    1
    
    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
     

  11. #11
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    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 :
    1
    2
    3
    4
    5
    
    // 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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    // 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*
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  12. #12
    flaavia flaavia ist offline Mitglied Bronze
    Registriert seit
    Dec 2003
    Beiträge
    37


    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*
    Geändert von flaavia (10.02.04 um 09:19 Uhr)
     

  13. #13
    Avatar von Konstantin Gross
    Konstantin Gross Konstantin Gross ist offline Mitglied Platin
    Registriert seit
    Sep 2003
    Ort
    nähe Kassel (Hessen)
    Beiträge
    703
    Ich denke er meint mit m (member).
     
    Internetseite:
    http://www.texturenland.de

    Blog:
    http://blog.texturenland.de

    Codesnippets:
    .NET-Snippets

    - Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -

  14. #14
    Registriert seit
    Aug 2002
    Ort
    Passau / Bayern
    Beiträge
    344
    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.
     
    Das Leben ist sch**ße ... aber die Grafik ist geil!

  15. #15
    theplake3000 theplake3000 ist offline Rookie
    Registriert seit
    Jun 2007
    Beiträge
    7
    Zitat Zitat von Konstantin Gross Beitrag anzeigen
    Form1 form1 = new Form1();
    form1.Show();

    wenn ich das mache sagt er Form1 ist nicht deklariert.Included hab ich es.
     

Ähnliche Themen

  1. [C++] Labels außerhalb der Form1 Klasse ändern
    Von litlein im Forum .NET Windows Forms
    Antworten: 17
    Letzter Beitrag: 11.04.10, 22:55
  2. Außerhalb von JFrame setCursor ansprechen?
    Von flashray im Forum Java
    Antworten: 3
    Letzter Beitrag: 18.01.06, 14:54
  3. "Sub Main" wurde nicht in "LabCalculator.Form1" gefunden?
    Von Christoph1972 im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 20.05.05, 17:31
  4. Button-Instanz aus _root ansprechen
    Von cargo im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 09.02.05, 16:06
  5. Form1.RichtextBox von anderer Klasse ansprechen
    Von flotschie im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 30.01.05, 14:04