Laden...

UserControl öffnen und an Form binden

Erstellt von tristar vor 7 Monaten Letzter Beitrag vor 7 Monaten 382 Views
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Monaten
UserControl öffnen und an Form binden

Hallo mal wieder,

ich habe eine Form mit einem TabControl. Auf der ersten TabPage erscheint eine Übersicht (ucUebersicht - basierend auf einem UserControl). Bei Auswahl einer Zeile wird ein weiteres UserControl (ucDaten) als neue TabPage erstellt.

Form.cs

...
 ucUebersicht uc = new ucUebersicht(null);
 ...
 
 public FormStart()
        {
            InitializeComponent();
            
            AufrufUebersicht();
        }
         void AufrufUebersicht()
        {
            uc.Dock = DockStyle.Fill;
            this.tabPageUebersicht.Controls.Add(uc);
        }
        private void FormStart_Load(object sender, EventArgs e)
        {
            uc.OnSelected += OnSelected;
        }
        private void OnSelected(Part p)
        {
            AufrufUcPart(p);
        }
        void AufrufUcPart(Part p)
        {
            try
            {
                System.Windows.Forms.Cursor.Current = Cursors.WaitCursor;
                Control c = new UserControls.ucDaten(p);
                if (p != null)
                    AddUserControls.AddControltoTabControl(tabControl, c, p.Nummer);               
            }
            finally
            { System.Windows.Forms.Cursor.Current = Cursors.Default; }
        }

ucUebersicht.cs

...
public event Action<Part> OnSelected;
...
 private void dgUebersicht_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
            {
                try
                {
                    Cursor.Current = Cursors.WaitCursor;
                    part = dgUebersicht.Rows[e.RowIndex].DataBoundItem as Part;
                    if (part!= null)
                    {
                        OnSelected?.Invoke(part);
                    }

                }
                finally { Cursor.Current = Cursors.Default; }
            }
        }

Das funktioniert soweit auch alles prima.

Nun würde ich aber gerne aus dem UserControl ucDaten heraus durch eine Aktion eine weitere TabPage ucDaten öffnen - auf meiner FormStart, im TabControl.

Mein Problem dabei ist, wie kann ich aus diesem UserControl (ucDaten) heraus meine Form bzw. TabControl ansprechen, damit dann eine weitere TabPage angehängt wird? Bisher wird ja zunächst die Form geladen und die Übersicht angedockt und das UserControl ist der Form "bekannt".

Ich hoffe, ihr versteht mein Problem? Und danke schon mal für die Hilfe!

4.917 Beiträge seit 2008
vor 7 Monaten

So wie du in ucUebersicht ein Event (OnSelected) benutzt, so erzeuge dann auch in dem UserControl ucDaten ein Event und abonniere es dann in der Form.

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Monaten

So hatte ich es versucht bzw. verstehe auch deine Antwort:

ucDaten.cs

...
public event Action<Part> OnSelected;
...

private void btnTest_Click(object sender, EventArgs e)
        {

                    Part part = GetTestObject("0815");
                    if (part!= null)
                    {
                        OnSelected?.Invoke(part);
                    }
        }

FormStart.cs

ucDaten ucDaten = new ucDaten();

private void FormStart_Load(object sender, EventArgs e)
        {
            uc.OnPartSelected += OnPartSelected;
            ucDaten.OnSelected += UcDaten_OnSelected;
        }
        private void  UcDaten_OnSelected(Part obj)
        {
            // Aktion
        }

Ist es so falsch umgestezt?

Die Aktion mit dem Buttonclick wird aufgerufen, danach passiert aber nichts mehr. Der Debugger sprint auch nicht auf die FormStart.

4.917 Beiträge seit 2008
vor 7 Monaten

Hast du es denn mit der richtigen ucDaten-Instanz abonniert?

Also in deinem Eingangsbeitrag in AufrufUcPart:

var c = new UserControls.ucDaten(p);
c.OnSelected += UcDaten_OnSelected;
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor 7 Monaten

Danke, das war der entscheidende Hinweis!

Nun klappt es - danke!