Load Event einer anderen Form aufrufen

exiter28

Erfahrenes Mitglied
:) also die Labels gehören zu einem StatusStrip des MDIParent.

Ich möchte es einfach nur schaffen, daß ich das Load Event des MDIParent dann aufrufe, wenn die
zweite Form (Options) geschlossen wird. In VB.Net musste ich einfach aus dem Privat ein Public
machen, dann konnte ich das Event auch aus einer fremden Form aus aufrufen. Hier klappt das nicht
so einfach. Hast Du kein Beispiel für mich?

Dank Dir!
 

napstermania

Mitglied
Hi exiter,

wenn du eine statische Methode aufrufst dann hast du in dieser kein Verweis auf deine eigene Instanz. Deswegen kannst du auch statische Methoden ohne Objektverwseise aufrufen. Wenn du die Verweise von der Instanz nutzen möchtest in der auch deine Methode steckt dann verwende keine statische Methode.

Grüsse
 

exiter28

Erfahrenes Mitglied
ok, aber wenn die Methode nicht statisch ist, dann kann ich diese doch nicht von einer
anderen Form aufrufen oder?

Danke!
 

Shakie

Erfahrenes Mitglied
Doch, du brauchst allerdings einen Verweis zur Form
C#:
Form eineForm = new MDIParent1();
eineForm.MDIParent1_Load(null,null);
Edit: Nico hat Recht, es muss natürlich so lauten:
C#:
Form MDIParent1 = new MDIParent1();
 
Zuletzt bearbeitet:

exiter28

Erfahrenes Mitglied
wenn ich das mit z.B.:

Form mdi = new MDIParent1();
mdi.MDIParent1_Load(null,null);

mache, wird die Methode MDIParent1_Load nicht angezeigt.

Wo ist denn hier noch der Fehler****

Danke
 

Nico Graichen

Erfahrenes Mitglied
Hi

1. Solltest du die EventHandler nicht public machen. Wenn du darin auf den sender oder die EventArgs zugreifen willst hast du ein Problem. Lager den Code in eine extra Methode aus, mach diese public und ruf diese auf.
Diese kannst du dann sowohl in der eigentlich Klasse nutzen als auch überall da, wo du eine Referenz darauf hast. Wichtig ist dabei, dass du die Referenz auf die richtig Instanz hast und nicht wieder eine neue anlegst

2. Bei dem von dir zuletzt geposteten Code (und auch der von Shakie) wird die Methode MDIParent_Load() nicht angezeigt, weil diese nicht in der Klasse Form existiert. Wenn du Methoden aus der Klasse MDIParent aufrufen willst musst du den Typ auch verwenden, nicht die Basisklasse!

3. Poste hier mal bitte deinen Code (zusammengefasst!), so dass wir mal schauen können, was du machst!
 

exiter28

Erfahrenes Mitglied
Hi,

ok, also der folgende Code ist vom MDIParent1 oder auch vom childform (sind beide gleich):
(das Load Event)

Code:
        private void childForm_Load(object sender, EventArgs e)
        {
            try
            {
                    LoadClass.CompressTempFile(IniClass.textfile);
                    LoadClass.LoadListBoxTemp(lbPreviewTemp6, IniClass.textfile);
                    LoadClass.LoadListBox(lbPreview, lbPreviewTemp, lbPreviewTemp2, lbPreviewTemp3, lbPreviewTemp4, lbPreviewTemp5, lbUrlTemp, IniClass.textfile);
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Jetzt der Code der 2. Form (EditForm), bzw. das CloseEvent:
(hier sollte ja eigentlich der Code zum Aufruf des LoadEvent´s der childform?)
Code:
        private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
        {

        }
Damit Ihr besser versteht, was ich hier mache:
in der childform befindet sich eine Listbox, welche mit Informationen einer Textfile gefüllt wird.
Die einzelnen Zeilen der Box kann man dann mit der r.MT. editieren, daraufhin öffnet sich nun die
2.Form (EditForm). In dieser befindet sich eine identische Box mit den gleichen Inhalten. Hier kann man Änderungen der Informationen durchführen. Das Ändern bewirkt eine Neuerzeugung der Textfile / bzw. eine Änderung der File. Wenn ich nun die EditForm schließe, sollen die Änderungen auch in der Box der childform neu geladen werden. Und genau hier ist das Problem, das Neuladen gelingt mir nur, wenn ich die childform schließe und wieder öffne (LoadEvent). Ich möchte jedoch das Schließen und
Öffnen vermeiden und einfach nur das LoadEvent dann aufrufen, wenn die EditForm geschlossen wird.
Ich hoffe das reicht Euch....

Danke!
 

napstermania

Mitglied
Hallo exiter,

hier mal ein Methode wie das ganze realisiert werden könnte. Es ist sicherlich keine Musterlösung, aber für eine Prinzipielle veranschaulichung sollte es genügen.

Hier die Klasse für meine ParentForm:
C#:
namespace ListboxEditText
{
    public delegate void DatenAddEvent();    

    public partial class ParentForm : Form
    {
        Daten _daten;
        
        public ParentForm()
        {
            InitializeComponent();

            // initialisiere dummy werte
            _daten = new Daten();
            _daten.DatenAdd("Hallo");
            _daten.DatenAdd("ich");
            _daten.DatenAdd("bin");
            _daten.DatenAdd("eine");
            _daten.DatenAdd("Liste");
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            using (EditForm frmEdit = new EditForm(ref _daten))
            {
                // event anmelden
                frmEdit.dataAdd += new DatenAddEvent(frmEdit_dataAdd);
                // edit form öffnen
                frmEdit.ShowDialog();
                // event wieder abmelden
                frmEdit.dataAdd -= new DatenAddEvent(frmEdit_dataAdd);
            }
        }

        void frmEdit_dataAdd()
        {
            // inhalt der liste erneut laden
            LoadList();
        }

        public void LoadList()
        {
            lbContent.Items.Clear();
            lbContent.Items.AddRange(_daten.DatenListe());
        }

        private void ParentForm_Load(object sender, EventArgs e)
        {
            LoadList();
        }
    }
}

Jetzt die EditForm:
C#:
namespace ListboxEditText
{
    public partial class EditForm : Form
    {
        Daten _daten;

        public event DatenAddEvent dataAdd;

        public EditForm(ref Daten daten)
        {
            InitializeComponent();

            _daten = daten;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            // zur listbox hinzufügen
            lbContent.Items.Add(tbAddText.Text);

            // zur liste hinzufügen
            _daten.DatenAdd(tbAddText.Text);
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void EditForm_Load(object sender, EventArgs e)
        {
            // listbox leeren
            lbContent.Items.Clear();

            // erneut mit daten füllen
            lbContent.Items.AddRange(_daten.DatenListe());
        }

        private void EditForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // wenn die form geschlossn wird das event auslösen
            if(dataAdd != null)
                dataAdd();
        }
    }
}

Nun noch die Datenklasse

C#:
namespace ListboxEditText
{
    public class Daten
    {
        private List<string> _datenListe;

        public Daten()
        {
            _datenListe = new List<string>();
        }
        
        public string[] DatenListe()
        {
            return _datenListe.ToArray();
        }

        public void DatenAdd(string value)
        {
            _datenListe.Add(value);
        }

        public void DatenRem(string value)
        {
            _datenListe.RemoveAt(_datenListe.IndexOf(value));
        }
    }
}

Ich habe hier bewust ein event eingesetzt, weil man dadurch flexibel bleibt.
Ich hoffe das hilft dir etwas weiter.

Grüsse
 

Nico Graichen

Erfahrenes Mitglied
Hi

Nach dem du die EditForm instanziert hast abonnierst du von dieser das Closed-Event (in deiner ParentForm). Darin rufst du deine LoadList-Methode auf.

Aber noch 2 andere Dinge:
Wieso willst du das so machen? Du öffnest die EditForm modal und weißt daher auch wann diese geschlossen wurde und kannst danach die Daten neu laden.

Da du die EditForm in einem Using-Statement nutzt, brauchst du auch kein Unsubscribe auf ein Event machen. Alle Referenzen sind nach Ende der Using-Statements weg.