C# FormClosed Ereignis abrufen?

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
596
Hallo zusammen

Ich arbeite an einem Projekt, welches zwei Forms verwendet. Die FormMain und die FormSettings.

Durch einen Buttonklick wird die FormSettings geöffnet (mit Show).

Nund mache ich dort ein paar einstellungen und wird danach durch Buttonklich (this.Close();) geschlossen.

Das funktioniert wunderbar, nun müsste ich aber in der FormMain sobald die Formsettings geschlossen wird einen Codeteil ausführen.

Alle Hilfen im Internet nützen mir nicht, ich bringe es nicht zum laufen.

kann mir wer helfen?

Gruss
 
Du müsstest eine Instanz von FormSettings in FormMain haben und dich an das Event OnClosing anhängen.

Mit IntelliSense sollte eigentlich folgendes reichen: frmSettings.OnClosing += und 2x Tab drücken, damit wird der Eventhandler erzeugt, darin kannst du dann deinen Code ausführen.

EDIT:

Nochmal nachgesehen:

set = new FormSettings();
set.FormClosed += new FormClosedEventHandler(set_FormClosed);
 
Zuletzt bearbeitet:
Hier wäre hilfreich, wenn du etwas genauer beschreibst, was FormSettings macht und was dann beim Schließen in FormMain geschehen soll...
Ich gehe jetzt einfach mal davon aus, dass du in der FormSettings eine Einstellung machst, die du in FormMain anschließend brauchst (z.B. Größe der Form o.ä.). In dem Fall würde ich eine Klasse erstellen, die alle Einstellungen aufnimmt und dann hinterher an die FormMain zurückgeben kann.

(Entwickler gucken jetzt bitte weg...)
Beispiel in FormSettings:
neues Objekt deiner Klasse Settings:
Settings set = new Settings();

in irgendeiner Methode wird dann dein Objekt gefüllt
set.Einstellung1 = <bla>;
am ende wird eine Property aus FormMain aufgerufen
FormMain.SetSettings = set;

so ungefähr... oder wie mein Vorredner schon schreibt einfach eine Instanz von FormMain in FormSettings vorhalten, is aber sehr unsauber in dem Fall...
 
Also der Sinn vom Programm ist ein HTML - Codegenerator.

In FormMain Kann ich eine HTML und eine CSS datei erstellen. Dann möchte ich aus Platzgrunden ein paar Einstellungen (Hintergrundfarbe, Schriftart) in eine andere Form (FormSettings) auslagern. Dort mache ich die Einstellungen und schreibe sie in eine CSS datei.

Wenn die zweite Form(Formsettings) geschlossen wird, sollte in FormMain der Inhalt der CSS datei in eine RichTextBox eingelesen werden.


Hier der Code von FormMain:
Code:
/* **************************************************************
 * Dieses Programm dient zum erstellen eines HTML - Gerüsts 
 * Inkl. einiger Grundwerkzeuge. Das Programm erstellt eine
 * HTML - Datei und den dazugehöhrigen Code.
 * **************************************************************
*/

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;
using System.IO;
using System.Diagnostics;

namespace HTML_CodeGenerator
{
    public partial class FormMain : Form
    {
        //***********Variabeln***************
        private string Filesource;
        private string htmlgeruest;
        private string selectedText;
        private string dateiname;
        private StreamWriter HtmFile;
        public string csssource { get; set; }
        //***********************************

        //Die FormSettings laden
        private FormSettings Grundeinstellungen;
        public FormMain()
        {
            InitializeComponent();
            Grundeinstellungen = new FormSettings();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            //Das Grundgeruest von HTML in einem String definieren
            htmlgeruest = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">";
            htmlgeruest += Environment.NewLine + "<html>";
            htmlgeruest += Environment.NewLine + "  <head>";
            htmlgeruest += Environment.NewLine + "      <title>" + "</title>";
            htmlgeruest += Environment.NewLine + "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + dateiname + ".css\">";
            htmlgeruest += Environment.NewLine + "  </head>";
            htmlgeruest += Environment.NewLine + "  <body>";
            htmlgeruest += Environment.NewLine + "  </body>";
            htmlgeruest += Environment.NewLine + "</html>";
        }

        //Per Klick auf button_einrichten die Formsettings starten
        private void button_einrichten_Click(object sender, EventArgs e)
        {
            Grundeinstellungen.csssource = this.csssource;
            Grundeinstellungen.Show(); 

            /*Grundeinstellungen.ShowDialog();
            string str = Grundeinstellungen.HTMLFarbe;*/
        }

        //Datei erstellen mit SavafileDialog
        private void button_CreateFile_Click(object sender, EventArgs e)
        {
            SaveFileDialog dlgSave = new SaveFileDialog();

            string FileName = "";
            dlgSave.DefaultExt = "htm";

            if (dlgSave.ShowDialog() == DialogResult.OK)
            {
                FileName = dlgSave.FileName;
                StreamWriter sw = File.CreateText(FileName);
                sw.Write(htmlgeruest);
                Filesource = FileName;
                sw.Flush();
                sw.Close();
                using (StreamReader sr = new StreamReader(Filesource))
                    richTextBox_Fileview.Text = sr.ReadToEnd();                 //html Datei in RichTextBox einlesen
                dateiname = Path.GetFileNameWithoutExtension(Filesource);
                csssource = Path.GetDirectoryName(Filesource) + "\\" + dateiname + ".css";
                MessageBox.Show(csssource);
                File.Create(dateiname + ".css").Close();                           //CSS Datei erstellen und schliessen
                if (File.Exists(dateiname + ".css"))
                {
                    using (StreamReader sr = new StreamReader(dateiname + ".css"))
                        richTextBox_css.Text = sr.ReadToEnd();                  //css Datei in RichTextBox einlesen
                }
                else
                {
                    MessageBox.Show("Die CSS Datei wurde nicht gefunden");
                }
            }
        }

        //Datei öffnen mit openfileDialog //Aus MSDN übernommen
        private void button_openfile_Click(object sender, EventArgs e)
        {
            Stream myStream;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "Textdateien|*.txt|Internetdateien|*.htm;*.html";  //Auswahl auf htm und html Datein beschränken
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = openFileDialog1.OpenFile()) != null)
                {
                    myStream.Close();
                }
                MessageBox.Show("datei" + openFileDialog1.FileName);
                Filesource = openFileDialog1.FileName;

                using (StreamReader sr = new StreamReader(Filesource))
                    richTextBox_Fileview.Text = sr.ReadToEnd();                 //Datei in RichTextBox einlesen
                dateiname = Path.GetFileNameWithoutExtension(Filesource);
                File.Create(dateiname + ".css").Close();                           //CSS Datei erstellen und schliessen
                if (File.Exists(dateiname + ".css"))
                {
                    using (StreamReader sr = new StreamReader(dateiname + ".css"))
                        richTextBox_css.Text = sr.ReadToEnd();                  //css Datei in RichTextBox einlesen
                }
                else
                {
                    MessageBox.Show("Die CSS Datei wurde nicht gefunden");
                }
            }
        }

        //einen Titel erstellen und in die Datei schreiben
        private void button_titlecreate_Click(object sender, EventArgs e)
        {
            if (Filesource == "")
            {
                MessageBox.Show("Bitte zuerst eine Datei erstellen oder öffnen");
            }
            //definieren der Grösse
            //*************************************************
            string grösse1;
            string grösse2;
            if (comboBox_grösseTitel.Text == "klein")
            {
                grösse1 = "<h3>";
                grösse2 = "</h3>";
            }
            else if (comboBox_grösseTitel.Text == "mittel")
            {
                grösse1 = "<h2>";
                grösse2 = "</h2>";
            }
            else if (comboBox_grösseTitel.Text == "gross")
            {
                grösse1 = "<h1>";
                grösse2 = "</h1>";
            }
            else
            {
                MessageBox.Show("Fehler in Grössendefinition");
                grösse1 = "<h1>";
                grösse2 = "</h1>";
            }
            //**************************************************
            selectedText = richTextBox_Fileview.SelectedText;
            selectedText = grösse1 + selectedText + grösse2;
            MessageBox.Show(selectedText);
            richTextBox_Fileview.SelectedText = selectedText;

            HtmFile = File.CreateText(Filesource);                //Inhalt von RichTextBox in datei schreiben

            HtmFile.Write(richTextBox_Fileview.Text);
            HtmFile.Close();
        }

        private void button_review_Click(object sender, EventArgs e)
        {
            Process.Start(Filesource);                              //Datei mit standardbrowser öffnen

            HtmFile = File.CreateText(Filesource);                  //Inhalt von RichTextBox in datei schreiben
            HtmFile.Write(richTextBox_Fileview.Text);
            HtmFile.Close();
        }


    }
}

Hier der Code von FormSettings:
Code:
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;
using System.IO;
using System.Diagnostics;

namespace HTML_CodeGenerator
{
    public partial class FormSettings : Form
    {
        public string HTMLFarbe { get; set; }
        public Font SchriftArt { get; set; }
        public string csssource { get; set; }



        public FormSettings()
        {
            InitializeComponent();
            this.csssource = csssource;
        }

        private void FormSettings_Load(object sender, EventArgs e)
        {
        }

        private void button_backcolor_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            HTMLFarbe = ColorTranslator.ToHtml(colorDialog1.Color);
            MessageBox.Show(HTMLFarbe);
            MessageBox.Show(csssource);
            StreamWriter sw = File.CreateText(csssource);
            sw.Close();
            StreamWriter myFile = new StreamWriter(csssource);
            myFile.Write(HTMLFarbe);
            myFile.Close();

        }

        private void button_font_Click(object sender, EventArgs e)
        {
            fontDialog1.ShowDialog();
            SchriftArt = fontDialog1.Font;
        }

        private void button_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

Hier das Frontend:

Klick

Mit Klick auf "Grundeinstellungen" wird die FormSettings geöffnet. Wenn sie wider geschlossen wird, sollte die CSS datei (Dateipfad in csssource) in die Richtextbox rechts eingelesen werden.

Gruss
Ergänzung ()

Damit es nicht untergeht: Doppelpost:


Grundsätzlich müsste ich die RichTextBox_css public machen, damit ich von der FormSettings in die RichTextBox_css in der FormMain schreiben kann..

(dann könnte ich dies auf den CloseButton legen)
 
Ähm, du benutzt ShowDialog und nicht Show, wie du im ersten Post gesagt hattest - das ist ein kleiner, aber weitreichender Unterschied:
Show öffnet ein zweites Form, aber beide Forms laufen parallel zueinander. ShowDialog dagegen öffnet das Form modal, d.h. dein erstes Form wartet meines Wissens nach sowieso so lange bis dein zweites Form wieder geschlossen wird - wozu also brauchst du Events, die dir sagen, dass das Form geschlossen wurde?

Zum Werte übergeben kannst du übrigens auch nach dem Schließen des Fensters weiter auf die public-Eigenschaften deines Forms zugreifen, also kannst du dort Rückgabe-Werte hinterlegen...

EDIT:
Ok, Korrektur: du öffnest z.B. eine Farbwahl mit ShowDialog, aber nicht deine FormSettings-Instanz... hatte ich falsch verstanden! Sorry!
Spricht was dagegen ShowDialog statt Show zu verwenden?
 
Zuletzt bearbeitet: (Korrektur)
Wenn ich Showdialog verwende, öffnet er mir nur den Dialog der Farbauswahl. Wenn ich aber Farbe, Schriftart, Textart usw. einstellen möchte, erscheinen dann 3 Dialoge nacheinander. Ich möchte aber eine Form, wo ich mittels Button die einzelnen Dialoge aufrufen kann.

Emfpinde ich als eleganter..
Ergänzung ()

Ich habe es nun anders gelöst, habe einfach einen Aktualisieren- Button gemacht..
 
Zurück
Oben