Laden...

Steurung einer Form von einer anderen Form aus

Erstellt von rallepralle vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.599 Views
R
rallepralle Themenstarter:in
142 Beiträge seit 2008
vor 14 Jahren
Steurung einer Form von einer anderen Form aus

Hi,

ich habe Form1, die zwei Buttons enthält:
Button1: ruft eine Form2 auf
Button2: soll genau diese Form2 wieder schließen

Mein Code....
... für Form1:


    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            _frm2.Close();
        }


    }

...für Form2:


        private Form1 _frm1;

        public Form1 frm1
        {
            set { this._frm1 = value; }
        }


        public Form2()
        {
            InitializeComponent();
        }

Es kommt aber der Fehler: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.". ich dachte ich hätte "_frm2" verwiesen . 😕

Gelöschter Account
vor 14 Jahren

so gehts:

    public partial class Form1 : Form
    {

private Form2 frm2;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            frm2 = new Form2();
            frm2.Show();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            frm2.Close();
        }


    } 
916 Beiträge seit 2008
vor 14 Jahren

Man sollte sowas über Events lösen. Daher Form2 sollte sich an einem CloseEvent der Form1 anmelden, und Form1 feuert dieses dann nur noch. Siehe dazu Kommunikation zwischen 2 Forms.

Again what learned...

Gelöschter Account
vor 14 Jahren

@rollerfreak2:

Form1 soll ja Form2 öffnen und schließen. daher ist hier eine form2form kommunikation notwendig.

916 Beiträge seit 2008
vor 14 Jahren

Ok in diesem speziellen Fall ist es sinnvoll das man direkt in Form1 das Close der Form2 aufruft.

Again what learned...

R
rallepralle Themenstarter:in
142 Beiträge seit 2008
vor 14 Jahren

Danke! _frm2 ist doch "null", habe ich grad bemerkt. ^^

Aber ist das hier auch möglich und wie:
Ich drücke jetzt mit den Button2 im Form1 und dieser - nicht wie bisher die Form2 schließt, sondern - einen Button3 auf Form2 betätigt. Oder die Farbe des Button3 auf Form2 ändert.

wie würde der Code dann ausschauen?

Danke im Voraus!

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo rallepralle,

wir erwarten schon ein wenig Eigeninitiative. Der Hinweis auf [FAQ] Kommunikation von 2 Forms wurde ja schon von rollerfreak2 gegeben.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

R
rallepralle Themenstarter:in
142 Beiträge seit 2008
vor 14 Jahren

Aber ein button zu drücken, das sich auf einer anderen Form befindet ist schon möglich, oder? Ich habe den Code in Form2 folgendermaßen geändert und es kam die Fehlermeldung: Der Zugriff auf "....Form1.button3" ist aufgrund der Sicherheitsebene nicht möglich.


    public partial class Form2 : Form
    {
        private Form1 _frm1;

        public Form1 frm1
        {
            set { this._frm1 = value; }
        }
        

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _frm1.button3.Click += new System.EventHandler(_frm1.button3_Click);
        }
    }

Ihr müsst mir jetzt nicht den ganzen code geben, aber nur so als Bestätigung, dass es möglich ist. sonst such ich vollkommen umsonst.....

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo rallepralle,

der Button im zweiten Form ist private, demnach kannst du von außen nicht darauf zugreifen.
Ja, es ist möglich, von außen einen Click auf den Button zu simulieren, z.B. durch Aufruf einer als public deklarierten Methode des zweiten Fensters, die den Click per Button.PerformClick() auslöst.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

Gelöschter Account
vor 14 Jahren

ergänzend möchte ich noch anfügen:

das ziel das du erreichen willst, ist eine bestimmte methode auszuführen, die in diesem fall zufällig am buttonclick-event hängt. daher ist dieser weg ein "NO GO"

R
rallepralle Themenstarter:in
142 Beiträge seit 2008
vor 14 Jahren

wird die Änderung sofort sichtbar? ich hab das jetzt so geschrieben, aber die Änderung wird erst dann sichtbar, wenn ich eine neue Form1 öffne. ich will aber, dass die allererste Form1 beim Klicken auf Button3 sich ändert.

 public partial class Form2 : Form
    {
        public Form1 _frm1;
        
        public Form1 frm1
        {
            set { this._frm1 = value; }
        }
        
public Form2()
        {
            InitializeComponent();
            
        }
private void button3_Click(object sender, EventArgs e)
        {
            _frm1 = new Form1();
            this._frm1.pictureBox1.BackColor = System.Drawing.Color.Black;
_frm1.Show();

        }

statt "Show()" habe ich schon versucht "Update()" zu schreiben....

T
111 Beiträge seit 2005
vor 14 Jahren

Hallo rallepralle,

schau Dir nochmals die FAQ über die Kommunikation zwischen den Forms an. Prinzipiell soll der Austausch zwischen zwei Formularen so aussehen wie hier dargestellt:

  
   Form1                                                    Form2
  +------+                                                +---------+
  |      |       direkt über Properties und Methoden      |         |
  |      |----------------------------------------------->|         |
  |      |                                                |         |
  |      |                                                |         |
  |      |      indirekt über Events                      |         |
  |      |<-----------------------------------------------|         |
  +------+                                                +---------+

Wie oben dargestellt kann Form1 direkt auf Daten (über Properties) und public Methoden von Form2 zugreifen. Umgekehrt soll dies nur über Events laufen.

lG
Thomas

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo rallepralle,

es macht einen riesen Unterschied, ob Form1 Form2 steuern soll oder umgekehrt. thomas.at hat das der schön visualisiert. Weiter oben schreibst du, dass Form1 Form2 steuern soll, dein Code bezieht sich aber auf den umgekehrten Fall.

Wichtig ist:

Nie auf Internas anderer Forms zugreifen. Stattdessen solle das zu steuernde Form2 öffentliche Methode anbieten, die Form1 aufrufen kann.

Nie von Form2 auf Form1 zugreifen. Form2 sollte Form1 nicht mal kennen. Für diese Richtung Events verwenden.

herbivore

R
rallepralle Themenstarter:in
142 Beiträge seit 2008
vor 14 Jahren

was ist der worst case dabei??

EDIT: Danke für all eure Input! ^^

Gelöschter Account
vor 14 Jahren

was ist der worst case dabei??

worst case ist unwartbarer code.