Autor Beitrag
schorge
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 01.10.14 11:11 
Hallo,

versuche nun seit längerem ein Problem zu lösen,
es geht nur um die Lösung deshalb habe ich ein kleines Testprojekt:

Ich habe ein Form in dem ein Panel mit einem UserControl ist.
Auf dem Form ist eine Listbox und auf dem UserControl ein Button.

Jetzt will ich mit dem Button einen Eintrag in der Listbox
auf Form1 machen.

Habe dieses nach folgendem Code probiert, jedoch bekomme ich nur
die Textbox "Hier Form1" und die Methode wird nicht ausgeführt


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProbiertProjekt
{
    public partial class Form1 : Form
    {
        UserControl1 userControl1;

        public Form1()
        {
            InitializeComponent();
            userControl1 = new UserControl1();            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            UserControl1 usr1 = new UserControl1();
            usr1.Dock = DockStyle.Fill;
            panel1.Controls.Add(usr1);  // UserCtr wird eingetragen
           
            listBox1.Items.Add("TEST");  // Testeintrag funktioniert natürlich
        }     

        public void DoSomething()
        {
            MessageBox.Show("Hier Form1");
            this.listBox1.Items.Add("TEST");
            OnMyEvent(EventArgs.Empty);  
        }        

        public event EventHandler MyEvent;

        protected virtual void OnMyEvent(EventArgs e)
        {
            EventHandler myEvent = MyEvent;
            if (myEvent != null)
            {
                myEvent(this, e);
            }
        }        

    }
    
}



UserControl
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProbiertProjekt
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1();
            frm1.MyEvent += myObjekt_MyEvent;

            frm1.DoSomething();     
        }              

        public static void myObjekt_MyEvent(Object objSender, EventArgs e)
        {
            MessageBox.Show("TestUserControl1");
        }

    }
}


Kann mir jemand sagen wie ich Form aus dem UserControl bediene?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 01.10.14 11:30 
Du erzeugst in button1_Click eine neue Form1 das ist nicht die gleiche Form1 auf der das UserControl liegt. Du führst also DoSomething an einer Instanz der Klasse Form1 aus die gar nicht angezeigt wird.

Du brauchst die Form auf der dein UserControl auch tatsächlich liegt. Dazu hat jedes Control (auch UserControl) eine ParentForm Property bzw. FindForm Methode.
Aber ehrlich gesagt bist du in einer Sackgasse unterwegs. Ein UserControl so zu schreiben das es einen konkrete Form Typ kennen muß (sonst könnte es nicht sinnvoll DoSomething aufrufen) hilft nicht. Stell dir vor ein Control wie ein Button wäre so geschrieben das es nur auf genau einer Form funktioniert und nicht auf jeder. Dein UserControl funktioniert aber nur auf diesem einen Form Typ wenn du das so umsetzt. Das ist wenig sinnvoll.

Du solltest die Logik anders herum aufbauen. Ziel sollte sein das die Form ruhig das Konkrete Control kennt aber nicht umgekehrt sonst schrämkst du die Einsatzfähigkeit des UserControls ein. Anders herum aufbauen heißt dein UserControl sollte eher einen Event werfen der von der Form gefangen wird. Da dieser auch von der Form verdrahtet wird weiß dann das UserControl nichts von dem Container auf dem es liegt und ist damit uiniversell einsetzbar (das Ziel eines Controls).
Wenn du durch den Button den Event auslöst kannst du den Event auf gleich so gestalten das die von der Form eventuell benötigten Daten gleich mitgesendet werden oder einfach dem UserControl eine Oberfläche/Interface geben über die dir Form die benötigten Daten vom UserControl erfragen kann. In der Richtigung ist das ~kennen~ ja kein Problem.
schorge Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 01.10.14 11:44 
Okay, die folgende Lösung funktioniert nun.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();                      
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            UserControl1 usr1 = new UserControl1();
            usr1.Dock = DockStyle.Fill;
            panel1.Controls.Add(usr1);  // UserCtr wird Hinzugefügt

            usr1.button1Click += DoSomething; // Das Event von button1 auf UserCtl wird Aboniert 
        }    


        private void DoSomething(object sender, EventArgs e)
        {
            listBox1.Items.Add("TetJuiop");
        }        

    }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();            
        }

        private void button1_Click(object sender, EventArgs e)
        {
           // Nicht erforderlich
        }  

        public event EventHandler button1Click
        {
            add { button1.Click += value; }
            remove { button1.Click -= value; }
        }

    }


ist diese Lösung so Sinnvoll?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 01.10.14 11:52 
Zitat:
ist diese Lösung so Sinnvoll?


Besser als vorher zumindest. Und das Muster selbst ist auch sinnvoll. Diese Lösung kann aber nur sinnvoll sein wenn das Problem selbst schon sinnvoll ist ;)
Bisher wissen wir nur das auf deinem UserControl ein Button liegt der irgendwas auf der Form auslösen soll. Da würde, von dem ausgehend was wir bisher wissen, einfach ein Button ohne UserControl ausreichen.