none
Anprechen von Controls in anderen Forms (?) RRS feed

  • Frage

  • Hallo zusammen,

    Ich habe ein (vermutlich triviales) Problem, dass sicherlich auch schon tausendmal irgenwo diskutiert wurde. Leider finde ich keinen Passenden Nenner :-( Und hoffe daher, dass hier jemand ist der mir einen Tipp, Stupser etc. geben kann.

    Ich bin gerade dabei mir ein Tool für Helligkeitsregelung (Laptop/Touchpad) zu erstellen (ja ich weiss, es gibt solche Tools bereits...)

    Nun habe ich eine Form erstellt (Form1) das ein NotifyIcon definiert und entsprechend anzeigt. Mittels einer Trackbar wird das NotifyIcon ensprechend den Einstellungen geändert. Soweit so gut. Nun rufe ich von dieser Form1 eine weitere Form auf (Form2). Diese Form beinhaltet mehrere Einstellmöglichkeiten (wie z.b. Automatische Anpassung über Uhrzeit oder bei bestimmten Programmstarts) Auch dieses funktioniert einwandfrei.

    Ichhabe auch in dieser Form2 eine Trackbar integriert bei der man die Helligkeit ebenfalls einstellen kann. Nun kommt mein Problem: Ich möchte auch hier, dass das NotifyIcon (welches in Form1 definiert wurde) entsprechend den Einstellungen der Trackbar von Form2 angepasst wird?!?

     

    Wenn ich in Form2 einen bezug mittels Form1 frm1 = new Form1(); herstelle, kann ich zwar auf das in dieser Form definierte NotifyIcon zugreifen - jedoch wird diese neu Instaziiert (hoffe es ist das richtige Wort) und nicht auf das bestehende (bereits aktive) NotifyIcon zugegriffen?

     

    Ein ähnlich gelagertes Problem stellt sich mir auch, wenn ich ein Panel von Form2 über die Form1 (Kontextmenü) aufrufen will (Kontextmenü dient zum anspringen bestimmter Funktionen in der Form2)

     

    Vielleicht hat jemand einen Tipp, wie ich gezielt auf bereits definiert/deklarierte Controls von einer Form in einer anderen Form zugreifen kann.

    Vielen Dank im Vorraus

    Robert

     

     

    PS. Mein Tool lehnt an http://www.codeproject.com/KB/gadgets/ScreenBrightnessControl.aspx an

    Dienstag, 22. November 2011 14:14

Antworten


  • Hallo Robert,

    Du musst, damit es funktioniert, dem Constructor der Form2 Klasse eine Referenz auf Dein Form1 Objekt übergeben.

    z.B.:

     


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form2 : Form
        {
            Form1 frm1;
            
            public Form2(Form1 frm)
            {
                InitializeComponent();
                frm1 = frm;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Close();
            }
        }
    }
    
    


    aufrufen kannst Du dies dann aus Deiner Form1 wie folgt:

    if (frm2 == null)
        frm2 = new Form2(this);
    
    
    

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Bearbeitet Heslacher Mittwoch, 23. November 2011 13:45
    • Als Antwort markiert oReSo Mittwoch, 23. November 2011 14:47
    Mittwoch, 23. November 2011 13:44
  • das mit dem Konstruktor wollt ich Dir auch vorschlagen, mußt halt beim Aufruf auch noch den this übergeben.

            private void button1_Click(object sender, EventArgs e)
            {
    
                if (frm2 == null)
                {
                    frm2 = new Form2(this);    // <-------
                }
    
                frm2.label1.Text = "TTTEEESSSTTT";
                frm2.ShowDialog();
            }
    

    Grüße

    • Als Antwort markiert oReSo Mittwoch, 23. November 2011 14:47
    Mittwoch, 23. November 2011 13:59
  • mußt halt noch in der form 2 ein override für´s schließen machen oder darfst halt ned die form2 schliessen!
    
    
    namespace Forms1
    {
        public partial class Form1 : Form
        {
            Form frm2;
    
            public Form1()
            {
                InitializeComponent();
                frm2 = new Form();
                frm2.Controls.Add(new UserControl1(this));
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.label1.Text = "TTTEEESSSTTT";
                frm2.ShowDialog();
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                frm2.Show();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.textBox1.Text = "TEST 1";
                frm2.Show();
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                this.Hide();
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.label1.Text = "TEST 2";
                frm2.Show();
            }
        }
    }
    
    namespace Forms1
    {
        public partial class UserControl1 : UserControl
        {
    
            Form1 frm1;
    
            public UserControl1()
            {
                InitializeComponent();
            }
    
            public UserControl1(Form1 fr)
            {
                InitializeComponent();
                frm1 = fr;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Parent.Hide();
            }
        }
    }
    
    
    
    


    • Bearbeitet sleepy007 Freitag, 25. November 2011 07:29
    • Als Antwort markiert oReSo Freitag, 25. November 2011 08:31
    Freitag, 25. November 2011 07:22
  • Hallo Robert,

    da solltest Du dann Deinem UserControl eine Eigenschaft spendieren, die Du mit einer Instanz der Form1 Klasse füttern kannst. Die Zuweisung der Eigenschaft kannst Du ja auch im Konstruktor der Form2 Klasse machen.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert oReSo Freitag, 25. November 2011 08:31
    Donnerstag, 24. November 2011 16:51
  • Hat sich mit dem Posting von http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/3269851e-8bab-43cc-aa58-63b2a2a52649 erledigt....

     

    • Bearbeitet oReSo Freitag, 2. Dezember 2011 09:14
    • Als Antwort markiert oReSo Freitag, 2. Dezember 2011 09:14
    Mittwoch, 30. November 2011 12:55

Alle Antworten

  • wie erstellst du denn die Fenster und rufst sie auf? Hast du eine Klasse die die Fenster Steuerung regelt, oder rufst von Fenster1 das Fenster2 auf?

    Dienstag, 22. November 2011 21:29
  • Wenn ich in Form2 einen bezug mittels Form1 frm1 = new Form1(); herstelle, kann ich zwar auf das in dieser Form definierte NotifyIcon zugreifen - jedoch wird diese neu Instaziiert (hoffe es ist das richtige Wort) und nicht auf das bestehende (bereits aktive) NotifyIcon zugegriffen?

    Naja, wenn Du Dir mit "new" ein neues erzeugst, dann erhälst du halt auch ein neues und nicht das bestehende!

    Ein bischen mehr Programmcode wäre auch nicht schlecht.

    Grüße

    Mittwoch, 23. November 2011 08:49
  • Hallo Catrin....

    ich habe mal so etwas ähnliches zusammen gestellt, da das eigentl. Tool zu groß sein dürfte, um es hier darzustellen.

    Dieses Demo besteht auf zwei Forms (Form1 und Form2) und verdeutlicht mein Problem (hoffe ich zumindestens)

    Form1: Hauptform, hat 4 Buttons: Button1 schreibt lediglich etwas in ein Label der Form2, Button2 prinzip wie Button1 jedoch anstatt in ein Label wird hier etwas in eine Textbox geschrieben, Button3 öffnet lediglich die Form2, Button4 wie Button1 jedoch schließt es zus. die Form1. Weiterhin ist ein Label, dass mit einem Wert aus Form2 (sofern es aufgerufen und geschlossen wurde) erhält.

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form1 : Form
        {
            Form2 frm2;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form2();
                }
    
                frm2.label1.Text = "TTTEEESSSTTT";
                frm2.ShowDialog();
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                    frm2 = new Form2();
    
                frm2.Show();
                // oder 
                // frm2.ShowDialog();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                    frm2 = new Form2();
    
                frm2.textBox1.Text = "TEST 1";
                frm2.Show();
                // oder 
                // frm2.ShowDialog();
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                this.Hide();
                
                if (frm2 == null)
                    frm2 = new Form2();
    
                frm2.label1.Text = "TEST 2";
                frm2.Show();
                // oder 
                // frm2.ShowDialog();
                
            }
    

    Die zweite Form: Form2 hat lediglich ein label (label1) in der der Text beim Klicken auf Form1/Button1 (b4) zw. Form1/Buttonüberschrieben wird.

     

    Weiterhin hat diese Form eine Textbox in der ebenfalls beim Klicken des Form1/Buttons2 etwas in das Text-Property geschrieben wird. Schließlich hat die Form2 noch einen Button (Button1) das wieder zur Form 1 zurück kehrt.

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form2 : Form
        {
            Form1 frm1;
            
            public Form2()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Close();
            }
        }
    }
    

     

     

    So nun starte ich das Tool: Form1 wird geöffnet. - ok

    Ein Klick auf Form1/Button1 öffnet die Form2 und überschreibt das Form2/label1.Text Property - ok

    Ein KLlick auf Form2/Button1 schließt das Form2 und öffnet nun ein neues Form1 - obwohl bereits eine Form1 noch geöffnet ist - Ergebnis ich habe zweimal Form1? - so nicht wirklich gewollt. Ich denke mal es liegt immernoch an dem "new" obwohl ich versucht habe dieses mit:

     

     if (frm1 == null)
                    frm1 = new Form1();
    

     


    abzufangen, wird IMMER ein "new Form1();" ausgeführt!

     

    Wie kann ich nun verhindern oder besser gesagt, was muss ich tun, damit wie obigen Fall auf die bereits bestehende Form1 zugriffen wird und nicht eine neue Form1 erstellt wird?

     

    Grüße

    Robert

     

     

    Mittwoch, 23. November 2011 13:17

  • Hallo Robert,

    Du musst, damit es funktioniert, dem Constructor der Form2 Klasse eine Referenz auf Dein Form1 Objekt übergeben.

    z.B.:

     


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form2 : Form
        {
            Form1 frm1;
            
            public Form2(Form1 frm)
            {
                InitializeComponent();
                frm1 = frm;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Close();
            }
        }
    }
    
    


    aufrufen kannst Du dies dann aus Deiner Form1 wie folgt:

    if (frm2 == null)
        frm2 = new Form2(this);
    
    
    

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Bearbeitet Heslacher Mittwoch, 23. November 2011 13:45
    • Als Antwort markiert oReSo Mittwoch, 23. November 2011 14:47
    Mittwoch, 23. November 2011 13:44
  • das mit dem Konstruktor wollt ich Dir auch vorschlagen, mußt halt beim Aufruf auch noch den this übergeben.

            private void button1_Click(object sender, EventArgs e)
            {
    
                if (frm2 == null)
                {
                    frm2 = new Form2(this);    // <-------
                }
    
                frm2.label1.Text = "TTTEEESSSTTT";
                frm2.ShowDialog();
            }
    

    Grüße

    • Als Antwort markiert oReSo Mittwoch, 23. November 2011 14:47
    Mittwoch, 23. November 2011 13:59
  • Hallo Cathrin,

    Hallo Hannes,

     

    Klingt einleuchtend. Und funktioniert auch "bedingt" - den wenn ich nur in der Form1 (die mehrere Buttons beinhaltet) nun eine zweitenach einer bereits aufgerufenen Funktion (sprich einen weiteren Klick auf einen Button) aufrufe erhalte ich folgende Meldung:

    "Auf das verworfene Objekt kann nicht zugegriffen werden.Objektname: "Form2"." Der erste Aufruf öffnete die Form2 der zweite Aufruf gibt mir diese Meldung aus und setzt den Zeiger (z.B. in "button3_Click") bei frm2.Show();

    Muss die Übergabe auch in Form1 für Form2 übergeben werden? Wenn ja (!) was macht man dann wenn man von Form1 mehrere unterschiedliche Forms aufrufen will?!? Das will mir nicht so ganz einleuchen.

    ###

    Nachtrag: Wenn ich die Form2 mit frm2.ShowDialog(); anstatt frm2.Show(); funktioniert das Ganze. Aber wieso?

    ###

    Grüße

    Robert

    Mittwoch, 23. November 2011 14:30
  •         private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Hide();   // <--- das close mit dem hide austauschen
            }
    


    tausch mal close mit hide.

    grüße

     

    Mittwoch, 23. November 2011 14:41
  • das hätte ich auch sehen können/müssen (!) :-(

    Vielen vielen Dank :-)

     


    • Bearbeitet oReSo Mittwoch, 23. November 2011 14:47
    Mittwoch, 23. November 2011 14:46
  • Hallo Cathrin,

    Hallo Hannes,

     

    darf ich nochmal hier kurz nachhaken? Das Ganze hat mit den von Euch gezeigten Codes prima funktioniert. Wie würde das Ganze aussehen wenn man das von einer UserControl aus steuern möchte? Also das in Form2 "verbaute" UserControl will auf Controls der Form1 zugreifen ohne dieses neu zu erstellen?

    Grüße

    Robert

    Donnerstag, 24. November 2011 15:36
  • Hallo Robert,

    da solltest Du dann Deinem UserControl eine Eigenschaft spendieren, die Du mit einer Instanz der Form1 Klasse füttern kannst. Die Zuweisung der Eigenschaft kannst Du ja auch im Konstruktor der Form2 Klasse machen.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert oReSo Freitag, 25. November 2011 08:31
    Donnerstag, 24. November 2011 16:51
  • mußt halt noch in der form 2 ein override für´s schließen machen oder darfst halt ned die form2 schliessen!
    
    
    namespace Forms1
    {
        public partial class Form1 : Form
        {
            Form frm2;
    
            public Form1()
            {
                InitializeComponent();
                frm2 = new Form();
                frm2.Controls.Add(new UserControl1(this));
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.label1.Text = "TTTEEESSSTTT";
                frm2.ShowDialog();
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                frm2.Show();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.textBox1.Text = "TEST 1";
                frm2.Show();
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                this.Hide();
                if (frm2 == null)
                {
                    frm2 = new Form();
                    frm2.Controls.Add(new UserControl1(this));
                }
                UserControl1 uc = new UserControl1();
                uc = (UserControl1)frm2.Controls["UserControl1"];
                uc.label1.Text = "TEST 2";
                frm2.Show();
            }
        }
    }
    
    namespace Forms1
    {
        public partial class UserControl1 : UserControl
        {
    
            Form1 frm1;
    
            public UserControl1()
            {
                InitializeComponent();
            }
    
            public UserControl1(Form1 fr)
            {
                InitializeComponent();
                frm1 = fr;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (frm1 == null)
                    frm1 = new Form1();
    
                frm1.Show();
                frm1.label1.Text = textBox1.Text;
                this.Parent.Hide();
            }
        }
    }
    
    
    
    


    • Bearbeitet sleepy007 Freitag, 25. November 2011 07:29
    • Als Antwort markiert oReSo Freitag, 25. November 2011 08:31
    Freitag, 25. November 2011 07:22
  • Hallo Cathrin,

    Hallo Hannes,

     

    erneut vielen Dank für eure Antworten - hat mir sehr geholfen, das Ganze etwas besser zu verstehen.

    Grüße

    Robert

    Freitag, 25. November 2011 08:36
  • Hallo nochmal :-(

     

    ich muss leider nochmal wegen dem UserControl nachhaken...

    Es will nicht so wie es soll... (was sicherlich an mir liegt!)

    Ich habe wie bereits oben erwähnt zwei Forms (Form1 und Form2)

    In Form2 ist ein UserControl (nur ein Button und ein Picture) platziert:

    Wenn ich "manipulationen" (bspl. ein Bild wechsele) funktioniert das in Richtung Form1 zum UserControl und Form2 zum UserControl.

    Jedoch der Umgekehrte Weg (also UserControl zu Form1 oder Form2) Funktioniert nicht so ganz.

    Code des UserCorntrols:

    using System;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class UserControl1 : UserControl
        {
            Form1 frm1;
            Form2 frm2;
            
            public UserControl1(Form1 fr) //(Form2 fr)
            {
                InitializeComponent();
                fr = frm1; //fr = frm2; 
            }
    
            public UserControl1()
            {
                InitializeComponent();
               
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                bool bL;
                
                if (frm1 == null)
                    frm1 = new Form1();
    
                if (frm2 == null)
                    frm2 = new Form2(frm1);
    
                bL = frm1.bLight;
    
                if (!bL)
                {  
                   // Info: Bitmaps: lightbulb; lightbulb_off, Icons: ON, OFF  
                   //als Resource in das Projekt eingebunden.
                    frm1.notifyIcon1.Icon = global::Test.Properties.Resources.ON; // ??? 
                    pictureBox1.Image = global::Test.Properties.Resources.lightbulb;
                    frm2.pictureBox1.Image = global::Test.Properties.Resources.lightbulb; // ???
                    frm1.bLight = true;
                }
                else
                {
                    frm1.notifyIcon1.Icon = global::Test.Properties.Resources.OFF; // ??? 
                    pictureBox1.Image = global::Test.Properties.Resources.lightbulb_off;
                    frm2.pictureBox1.Image = global::Test.Properties.Resources.lightbulb_off; // ???
                    frm1.bLight = false;
                }
                frm1.label4.Text = bL.ToString();
            }
        }
    }


     

    Mein Problem ist Hauptsächlich das NotifyIcon - hier wird mir ein zweites Icon in der Tray erstellt.

    Das "Haupt"-NotifyIcon ist in Form1 untergebracht.

    Ich hätte ja das komplette (MiniProjekt) hier gepostet aber gem. Richtlinie ist das hier nicht erwünscht...

    Vielleicht hat jemand eine Idee...

     

     

    Grüße

    Robert





    • Bearbeitet oReSo Dienstag, 29. November 2011 12:41
    Montag, 28. November 2011 13:34
  • Hat sich mit dem Posting von http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/3269851e-8bab-43cc-aa58-63b2a2a52649 erledigt....

     

    • Bearbeitet oReSo Freitag, 2. Dezember 2011 09:14
    • Als Antwort markiert oReSo Freitag, 2. Dezember 2011 09:14
    Mittwoch, 30. November 2011 12:55