Zum Inhalt springen

[C#]Multi Document Interface: Von Parent Form auf richTextBox in Child Form zugreifen


Nadine19

Empfohlene Beiträge

Ich bins mal wieder, also mein Texteditor funktioniert soweit :)

Jetzt soll ich ein Multi Document Interface erstellen um somit mehrere txt Dateien gleichzeitig öffnen und bearbeiten zu können.

Hab mich schon über MDI informiert und auch schon eins gebastelt, das funktioniert, bloß wie ich das auf den Texteditor anwende ist mir noch nicht so ganz klar.

Ich brauch ja ein Parent Form (frmEditor) und ein Child Form (Form2).

Auf dem Parent Form befindet sich bei mir das Menü, Toolbar usw. und auf dem Child Form habe ich meine richTextBox1 eingefügt die vorher auf dem Parent Form war. Nun meckert er ja, das sich auf dem Parent Form eben diese richTextBox1 nicht mehr finden lässt. Wie sage ich ihm jetzt das sich die richTextBox1 im Child Form befindet?

Achtung! Ich bin totale Anfängerin in C#!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du solltest jetzt von deiner Parent Form nicht mehr direkt auf die TextBox zugreifen sondern nur noch auf die Child Form(s).

Wenn du jetzt in einer der Child Forms zum Beispiel den Text setzten willst dann muss die Form dafür eine Funktion bereitstellen welche dann von der Parent Form aufgerufen wird.

Als anders ausgedrückt es sollte alles in sich gekapselt sein und jedes Teil nur noch das machen was es direkt betrifft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du jetzt in einer der Child Forms zum Beispiel den Text setzten willst dann muss die Form dafür eine Funktion bereitstellen welche dann von der Parent Form aufgerufen wird.

Wie erstelle ich so eine Funktion? Tut mir leid, aber irgendwie verstehe ich es nicht.

Hier ist mein Code vom frmEditor (Parent Form) zur besseren Verständnis:


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;


namespace Editor

{

    public partial class frmEditor : Form

    {

        private static string fileFilter = "Textdateien (.txt)|*.txt";



        private System.Drawing.Printing.PrintDocument docToPrint =

        new System.Drawing.Printing.PrintDocument();

        private bool textchangedAndNotSaved;

        private string strFile;



        public frmEditor()

        {

            InitializeComponent();


            this.SetFormTitle();


            this.textchangedAndNotSaved = false;

            this.StartPosition = FormStartPosition.CenterScreen;


            this.menuNeu.Click += new EventHandler(menuNeu_Click);

            this.menuSpeichern.Click += new EventHandler(menuSpeichern_Click);

            this.menuLaden.Click += new EventHandler(menuLaden_Click);

            this.menuBeenden.Click += new EventHandler(menuBeenden_Click);

            this.menuAllesMarkieren.Click += new EventHandler(menuAllesMarkieren_Click);



            this.richTextBox1.TextChanged += new EventHandler(richTextBox1_TextChanged);

            this.FormClosing += new FormClosingEventHandler(frmEditor_FormClosing);

        }


        void menuLaden_Click(object sender, EventArgs e)

        {

                OpenFileDialog openFile = new OpenFileDialog();

                openFile.Filter = fileFilter;

                DialogResult dr = openFile.ShowDialog();

                saveQuestion(false);


                if (dr == DialogResult.OK)

                {

                    richTextBox1.Clear();

                    string path = openFile.FileName;

                    StreamReader sr = new StreamReader(path);

                    string line = "";

                    while ((line = sr.ReadLine()) != null)

                    {

                        richTextBox1.Text += line + "\n";

                    }


                    this.strFile = openFile.FileName;

                    textchangedAndNotSaved = false;

                    this.SetFormTitle();

                    sr.Close();

                }

            }


        void menuSpeichern_Click(object sender, EventArgs e)

        {

            if (richTextBox1.Text.Length == 0)

                return;

            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

            this.SetFormTitle();

        }


        private void toolStripMenuItem1_Click(object sender, EventArgs e)

        {

            this.SaveDocument();

        }


        void menuNeu_Click(object sender, EventArgs e)

        {

            if (saveQuestion(false))

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

            else

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

        }



            private void SaveToFile()

        {

            try

            {

                StreamWriter sw = new StreamWriter(strFile, false);

                sw.Write(richTextBox1.Text);

                sw.Close();

            }

            catch (Exception e)

            {

                MessageBox.Show(e.Message);

                return;

            }

            this.textchangedAndNotSaved = false;

        }


        private void SaveDocument()

        {

            if (this.strFile != null && this.strFile.Length > 0)

                saveFileDialog1.FileName = this.strFile;

            saveFileDialog1.Filter = "Textdateien (*.txt)|*.txt|"

                                    + "Alle Dateien (*.*)|*.*";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)

            {

                this.strFile = saveFileDialog1.FileName;

                this.SaveToFile();

            }

            this.SetFormTitle();

        }


        public void SetFormTitle()

        {

            if (this.strFile == null || this.strFile.Length == 0)

                this.Text = "Texteditor - Unbekannt";

            else

                this.Text = "Texteditor - " + Path.GetFileName(this.strFile);


            if (this.textchangedAndNotSaved == true)

            {

                if (this.strFile == null || this.strFile.Length == 0)

                    this.Text = "Texteditor - Unbekannt" + "*";

                else

                    this.Text = "Texteditor - " + Path.GetFileName(this.strFile) + "*";

            }




        }


        private void richTextBox1_TextChanged(object sender, EventArgs e)

        {

            textchangedAndNotSaved = true;

            this.SetFormTitle();

        }



        private void frmEditor_FormClosing(object sender, FormClosingEventArgs e)

        {

            if (!saveQuestion(true))

                e.Cancel = true;

        }


        private void menuBeenden_Click(object sender, EventArgs e)

        {

            saveQuestion(true);

        }



        private void toolStripMenuItem6_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Undo();

        }


        private void toolStripMenuItem5_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Redo();

        }


        private void toolStripMenuItem4_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Cut();

        }


        private void toolStripMenuItem3_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Copy();

        }


        private void toolStripMenuItem7_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Paste();

        }


        private void menuAllesMarkieren_Click(object sender, EventArgs e)

        {

            this.richTextBox1.SelectAll();

        }


        private void formatToolStripMenuItem_Click(object sender, EventArgs e)

        {

            FontDialog fontDialog = new FontDialog();

            if (fontDialog.ShowDialog() != DialogResult.Cancel)

            {

                this.richTextBox1.Font = fontDialog.Font;

            }

        }


        private void farbeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            ColorDialog colorDialog = new ColorDialog();

            if (colorDialog.ShowDialog() != DialogResult.Cancel)

            {

                this.richTextBox1.ForeColor = colorDialog.Color;

            }

        }


        private void toolStripMenuItem2_Click(object sender, EventArgs e)

        {

            printDialog1.AllowSomePages = true;


            printDialog1.Document = docToPrint;


            DialogResult result = printDialog1.ShowDialog();


            if (result == DialogResult.OK)

            {

                docToPrint.Print();

            }

        }



        private bool saveQuestion(bool last)

        {

            if (textchangedAndNotSaved)

            {

                DialogResult dr = MessageBox.Show("Der Text wurde verändert!\n\nAktuelle Änderung speichern?",

                                                    "Speichern", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,

                                                     MessageBoxDefaultButton.Button1);

                if (dr == DialogResult.Yes)

                {

                    saveText();

                    if (last)

                        this.Dispose();

                    return true;

                }

                else if (dr == DialogResult.No)

                {

                    if (last)

                        this.Dispose();

                    else

                        return true;

                }

                else if (dr == DialogResult.Cancel)

                    return false;

            }

            else

                if (last)

                    this.Dispose();

            return false;

        }





        private bool saveText()

        {

            bool success = false;

            SaveFileDialog saveFile = new SaveFileDialog();

            saveFile.Filter = fileFilter;

            DialogResult dr = saveFile.ShowDialog();


            if (dr == DialogResult.OK)

            {

                string path = saveFile.FileName.ToString();



                try

                {

                    StreamWriter sw = new StreamWriter(path);

                    sw.Write(richTextBox1.Text);

                    sw.Flush();

                    sw.Close();

                    success = true;

                    textchangedAndNotSaved = false;

                }

                catch (Exception)

                {

                    success = false;

                }

            }


            return success;

        }


        private void toolStripButton2_Click(object sender, EventArgs e)

        {

            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = fileFilter;

            DialogResult dr = openFile.ShowDialog();


            if (dr == DialogResult.OK)

            {

                richTextBox1.Clear();

                string path = openFile.FileName;

                StreamReader sr = new StreamReader(path);

                string line = "";

                while ((line = sr.ReadLine()) != null)

                {

                    richTextBox1.Text += line + "\n";

                }


                this.strFile = openFile.FileName;

                textchangedAndNotSaved = false;

                this.SetFormTitle();

                sr.Close();

            }

        }


        private void toolStripButton1_Click(object sender, EventArgs e)

        {

            if (richTextBox1.Text.Length == 0)

                return;

            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

                this.SetFormTitle();

        }


        private void toolStripButton3_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Copy();

        }


        private void toolStripButton4_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Paste();

        }


        private void toolStripButton5_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Cut();

        }


        private void toolStripButton6_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Undo();

        }


        private void toolStripButton8_Click(object sender, EventArgs e)

        {

            if (saveQuestion(false))

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

            else

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

        }


        private void toolStripButton9_Click(object sender, EventArgs e)

        {

            printDialog1.AllowSomePages = true;


            printDialog1.Document = docToPrint;


            DialogResult result = printDialog1.ShowDialog();


            if (result == DialogResult.OK)

            {

                docToPrint.Print();

            }

        }


        private void newChildToolStripMenuItem_Click(object sender, EventArgs e)

        {

            // Declare the child form as a new one.

            Form2 childForm = new Form2();

            // Set the main form as a parent form.

            childForm.MdiParent = this;

            // Show the child form.

            childForm.Show();

        }


        private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.Cascade);

        }


        private void horizontalToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.TileHorizontal);

        }


        private void vertikalToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.TileVertical);

        }


    }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Guybrush Threepwood hat da völlig recht. Ich habe das mal etwas zusammen gefasst was dafür zu tun ist.

Du erstellst eine Variable vom Typ Deiner ChildForm(Form2) in deinem MDI-Container(Form1)


private Form2 currentForm = null;

In der ChildForm (Form2) erstellst Du eine öffentliche Methode die einen String entgegen nimmt und die eigene Textbox mit Text füllt.

        public void SetMyTextbox(String Eintrag)

        {

            this.textBox1.Text = Eintrag;

        }

In Form1 benutzt Du eine Schaltfläche(hier z.B. auf einer eine Menuebar) um den Text in einer Unterform zu setzen. Die Variable currentForm(vom Typ Form2) in der Form1 speichert beim Aufruf der Methode zum setzen des Textes, die momentan aktive Form. Dann rufst Du an der Variable die Methode "SetMyTextox" auf. So wird der Text immer nur in der gerade aktiven Form gesetzt.

        private void seToolStripMenuItem_Click(object sender, EventArgs e)

        {

            if (this.ActiveMdiChild != null)

            {

                currentForm = (Form2)this.ActiveMdiChild;

                currentForm.SetMyTextbox("Hier ist der Eintrag!");

            }

        }

Ich habe hier keine Fehlerbehandlung eingebaut. Falls Du ChildForms hast die nicht vom Typ Form2 sind wird dies Exceptions werfen.

Gruß,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für deine Antwort :)

Hat mir schon ein wenig weitergeholfen. Es funktionert, aber trotzdem zeigt er mir ja immer noch in Form1 (frmEditor/Parent Form) an das this.richTextBox1 nicht existiert, weil sie ja jetzt im Child Form ist.

Ich möchte ja in diesen Child Forms txt Dateien öffnen, speichern usw. können. Also das sich halt, wenn man auf "Neu" klickt ein Child Form öffnet mit einer leeren richTextBox. Wenn ich dann auf "Öffnen" klick soll sich in dieser aktiven Child Form in der richTextBox die txt Datei öffnen und auch speichern lassen.

Hoffe ihr versteht was ich meine.

Link zu diesem Kommentar
Auf anderen Seiten teilen

.NETler hat schon geschrieben was zu tun ist:

Du musst Deinem Childform eine Methode hinzufuegen, die sich um das Oeffnen und Anzeigen kuemmert.

Analog zu seinem SetMyTextbox benoetigst Du dann wohl eine OpenFile Methode.

Das heisst, wenn Du in Deinem Parentform den OpenFileDialog ausgefuehrt hast und den Dateinamen hast, dann uebergibst fuehrst Du die oeffentliche Methode OpenFile aus und uebergibst den Dateinamen. Die restliche Logik wird dann im Childform ausgefuehrt und muss/soll das Parentform nichts angehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh, sorry, da war ein uebergeben zuviel im Text, weil ich den Text zu unaufmerksam geaendert hatte.

Einfach gesagt, geh vor, wie es .NETler gesagt hat.

D.h. erstell Dir in Deinem Childform eine oeffentliche Methode OpenFile die als Parameter den Dateinamen nimmt:

        public void OpenTextFile(string Filename)

        {

            richTextBox1.LoadFile(Filename);

        }
In der Parentform musst Du dann nur noch in OpenFile Dein Childform erstellen und dann die OpenFilemethode oeffnen:

        private void OpenFile(object sender, EventArgs e)

        {

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

            openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";

            if (openFileDialog.ShowDialog(this) == DialogResult.OK)

            {

                string FileName = openFileDialog.FileName;

                if (System.IO.File.Exists(FileName))

                {

                    Form2 child = new Form2();

                    child.OpenTextFile(FileName);

                    child.Show();

                }

            }

        }

Ist getestet und funktioniert. Bei Fragen noch einmal fragen!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

in Deiner ParentForm gibt es keine RichtextBox mehr.

In den ClientForms bezieht sich "this" immer auf sich selbst, also auf die eigene Form. Jedes Objekt vom Typ Form2 kann seine eigene RichtextBox mit this.richtextBox1 ändern.

In der ParentForm darf es keinen Verweis auf irgendeine RichtextBox geben. Die Objekte vom Typ Form2(ClientForm) ändern ihre Eigenschaften (Text in der Box) an sich selbst. Die ParentForm sagt ihnen nur, dass sie es tun sollen.

Also raus mit RichtextBox in der ParentForm :)

Gruß,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

in Deiner ParentForm gibt es keine RichtextBox mehr.

In den ClientForms bezieht sich "this" immer auf sich selbst, also auf die eigene Form. Jedes Objekt vom Typ Form2 kann seine eigene RichtextBox mit this.richtextBox1 ändern.

In der ParentForm darf es keinen Verweis auf irgendeine RichtextBox geben. Die Objekte vom Typ Form2(ClientForm) ändern ihre Eigenschaften (Text in der Box) an sich selbst. Die ParentForm sagt ihnen nur, dass sie es tun sollen.

Also raus mit RichtextBox in der ParentForm :)

Gruß,

Thomas

Die richTextBox ist auch schon längst draußen. Bloß wie soll ich ihm das 25 mal in meiner Anwendung sagen?

Ein Beispiel:


        void menuSpeichern_Click(object sender, EventArgs e)

        {

            if (richTextBox1.Text.Length == 0)

                return;

            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

            this.SetFormTitle();

            toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

        }

Was schreibe ich denn statt richTextBox1.Text.Length == 0??? Oder hier:

        private void farbeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            ColorDialog colorDialog = new ColorDialog();

            if (colorDialog.ShowDialog() != DialogResult.Cancel)

            {

                this.richTextBox1.ForeColor = colorDialog.Color;

            }

        }

Was schreibe ich statt this.richTextBox1.ForeColor = colorDialog.Color?

Ich stehe momentan irgendwie total auf'n Schlauch...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die genaue Manipulation der Richtextbox hat in der Parentform nichtsmehr zu suchen!

Wie gesagt, ist die Bearbeitung der Richtextbox in den Childforms zu kapseln.

Du scheinst ja die Verarbeitung noch im Parentform zu haben.

Schauen wir uns mal das Beispiel an:


        void menuSpeichern_Click(object sender, EventArgs e)

        {

            if (richTextBox1.Text.Length == 0)

                return;

            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

            this.SetFormTitle();

            toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

        }

Im Parentform muss daraus etwas in dieser Art werden:

        void menuSpeichern_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).SaveTextFile();

        }

Und im Childform hast Du dann die Manipulation des Richtextcontrols:

        public void SaveTextFile()

        {

            if (richTextBox1.Text.Length == 0)

                return;

           else

                 richTextBox1.SaveFile(OpenFileName);

        }

Anmerkung: in OpenFileName habe ich mir nach dem Laden des Dokuments gleich den Dateinamen gespeichert, damit ich dann beim Speichern diesen Dateinamen verwenden kann. Anmerkung2: Nach dem erzeugen des Childs in meinem vorhergehenden Posting habe ich vergessen beim Child die Property MdiParent zu setzen. Wenn dies nicht geschieht, findet das Parentform kein ActiveChild. Also nochmal der Oeffnenteil in richtig:

        private void OpenFile(object sender, EventArgs e)

        {

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

            openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";

            if (openFileDialog.ShowDialog(this) == DialogResult.OK)

            {

                string FileName = openFileDialog.FileName;

                if (System.IO.File.Exists(FileName))

                {


                    Form2 child = new Form2();

                    child.MdiParent = this;

                    child.OpenTextFile(FileName);

                    child.Show();

                }

            }

        }

Bearbeitet von Pointerman
Link zu diesem Kommentar
Auf anderen Seiten teilen

@Mächtiger Pirat

Geschmackssache. Ich denke es ist ganz praktisch, wenn man die Logik weitesgehend vom Parentform trennt. So kann man auch Childforms mit anderen Elementen/Inhalten verwenden und speichern lassen, ohne dass man jedes mal das Parentform anpassen muss.

Was wären denn Argumente für das Speichern im Parentform?

Link zu diesem Kommentar
Auf anderen Seiten teilen

In dem Fall würde ich dann ein entsprechendes Interface bereitstellen an das sich die Child Forms halten müssen damit der Parent die Werte speichern/lesen kann.

So hast du alles halt wieder ordentlich gekapselt. Die Hauptanwendung kümmert sich um die gesammte Verwaltung und die Childform um ihre eigene Darstellung.

Aber ich denke für die Threaderstellerin ist das erstmal unwichtig ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klar waere dann ein Interface der richtige Weg. Alle Childforms implementieren es und man hat einen schoenen, einheitlichen Zugriff vom Parentform. Aber wie gesagt, das waere vielleicht etwas viel fuer den Anfang und ich dachte mir, dass die verlagerung der Logik in die Childforms schon ein Schritt in die richtige Richtung waere und sie sich so gleich angewoehnt, so zu arbeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach so, jetzt verstehe ich es ein wenig besser.

Aber wo genau bleibt dieser Rest:


            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

            this.SetFormTitle();

            toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

        }

bei

      public void SaveTextFile()

        {

            if (richTextBox1.Text.Length == 0)

                return;

           else

                 richTextBox1.SaveFile(OpenFileName);

        }

? Der fehlt da ja, ist aber wichtig damit mein Texteditor ordenlich funktioniert. Wie ändere ich denn z.B. das einfache Ausschneiden?

        private void toolStripMenuItem4_Click(object sender, EventArgs e)

        {

            this.richTextBox1.Cut();

        }

in etwas so in der Parent Form?:

((Form2)ActiveMdiChild).Cut();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal: Das Ausschneiden sieht doch schoneinmal gut aus!

Zum Rest:

Sehen wir uns noch einmal Deinen Ursprungscode an:

void menuSpeichern_Click(object sender, EventArgs e)

{

if (richTextBox1.Text.Length == 0)

return;

else if (this.strFile == null || this.strFile.Length == 0)

this.SaveDocument();

else

this.SaveToFile();

this.SetFormTitle();

toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

}

Der IF-Else-Block sollte sich auch im Child befinden.

Was Du bisher noch nicht machst, ist eine Ueberprufung, ob die Datei wirklich gespeichert wurde. Also evtl noch ein Rueckgabewert fuer die Oeffentlich Methode des Childforms.

Das setzen des Parentformtitels und des Status muss natuerlich im Parentform geschehen, also in der menuSpeichern_Click.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super, jetzt funktioniert soweit alles :D

Hab die Logik dahinter endlich verstanden.

Mich stören jetzt nur noch zwei Kleinigkeiten.

- Wenn man noch kein Child geöffnet hat und auf "Öffnen" klickt soll sich die ausgesuchte Datei in einem neuen Child öffnen

- Wenn man eine txt Datei öffnen möchte, diese aber schon geöffnet ist, soll man zu der Geöffneten weitergeleitet werden und somit nicht "doppelt öffnen" können

Hier nochmal der Code vom Parent Form:


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;


namespace Editor

{

    public partial class frmEditor : Form

    {


        public frmEditor()

        {

            InitializeComponent();


            this.StartPosition = FormStartPosition.CenterScreen;


            this.menuNeu.Click += new EventHandler(menuNeu_Click);

            this.menuSpeichern.Click += new EventHandler(menuSpeichern_Click);

            this.menuLaden.Click += new EventHandler(menuLaden_Click);

            this.menuBeenden.Click += new EventHandler(menuBeenden_Click);

            this.menuAllesMarkieren.Click += new EventHandler(menuAllesMarkieren_Click);

        }


        void menuNeu_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Neu();

        }


        void menuLaden_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Oeffnen();

        }


        void menuSpeichern_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Speichern();

        }


        public void toolStripMenuItem1_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Speichernunter();

        }


        public void menuBeenden_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Beenden();

        }


        public void toolStripMenuItem6_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Undo();

        }


        public void toolStripMenuItem5_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Redo();

        }


        public void toolStripMenuItem4_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Cut();

        }


        public void toolStripMenuItem3_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Copy();

        }


        public void toolStripMenuItem7_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Paste();

        }


        public void menuAllesMarkieren_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).SelectAll();

        }


        public void formatToolStripMenuItem_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).FontDialog();

        }


        public void farbeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).ColorDialog();

        }


        public void toolStripMenuItem2_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).PrintDialog();

        }


        public void toolStripButton8_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Neu();

        }


        public void toolStripButton2_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Oeffnen();

        }


        public void toolStripButton1_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Speichern();

        }


        public void toolStripButton3_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Copy();

        }


        public void toolStripButton4_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Paste();

        }


        public void toolStripButton5_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Cut();

        }


        public void toolStripButton6_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Undo();

        }


        private void toolStripButton7_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Redo();

        }


        public void toolStripButton9_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).PrintDialog();

        }


        public void newChildToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Form2 childForm = new Form2();

            childForm.MdiParent = this;

            childForm.Show();

        }


        public void cascadeToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.Cascade);

        }


        public void horizontalToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.TileHorizontal);

        }


        public void vertikalToolStripMenuItem_Click(object sender, EventArgs e)

        {

            this.LayoutMdi(MdiLayout.TileVertical);

        }


    }

}

Und der Code vom Child Form:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;


namespace Editor

{

    public partial class Form2 : Form

    {

        private static string fileFilter = "Textdateien (.txt)|*.txt";

        private System.Drawing.Printing.PrintDocument docToPrint =

        new System.Drawing.Printing.PrintDocument();

        private bool textchangedAndNotSaved;

        private string strFile;


        public Form2()

        {

            InitializeComponent();


            this.SetFormTitle();


            this.textchangedAndNotSaved = false;

            this.StartPosition = FormStartPosition.CenterScreen;


            this.richTextBox1.TextChanged += new EventHandler(richTextBox1_TextChanged);

            this.FormClosing += new FormClosingEventHandler(Form2_FormClosing);

        }



        public void Neu()

        {

            if (saveQuestion(false))

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

            else

            {

                this.richTextBox1.Clear();

                this.textchangedAndNotSaved = false;

                this.strFile = null;

                this.SetFormTitle();

            }

            //((frmEditor)MdiParent).toolStripStatusLabel1.Text = "Texteditor - Statusbar";

        }


        public void Oeffnen()

        {

            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = fileFilter;

            DialogResult dr = openFile.ShowDialog();

            saveQuestion(false);


            if (dr == DialogResult.OK)

            {

                richTextBox1.Clear();

                string path = openFile.FileName;

                StreamReader sr = new StreamReader(path);

                string line = "";

                while ((line = sr.ReadLine()) != null)

                {

                    richTextBox1.Text += line + "\n";

                }


                this.strFile = openFile.FileName;

                textchangedAndNotSaved = false;

                this.SetFormTitle();

                sr.Close();

            }

        }


        public void Speichern()

        {

            if (richTextBox1.Text.Length == 0)

                return;

            else if (this.strFile == null || this.strFile.Length == 0)

                this.SaveDocument();

            else

                this.SaveToFile();

            this.SetFormTitle();

            //toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

        }


        public void Speichernunter()

        {

            this.SaveDocument();

            //toolStripStatusLabel1.Text = "Texteditor - Gespeichert";

        }


        public void PrintDialog()

        {

            printDialog1.AllowSomePages = true;


            printDialog1.Document = docToPrint;


            DialogResult result = printDialog1.ShowDialog();


            if (result == DialogResult.OK)

            {

                docToPrint.Print();

            }

        }


        public void Beenden()

        {

            saveQuestion(true);

        }


        public void Undo()

        {

            this.richTextBox1.Undo();

        }


        public void Redo()

        {

            this.richTextBox1.Redo();

        }


        public void Cut()

        {

            this.richTextBox1.Cut();

        }


        public void Copy()

        {

            this.richTextBox1.Copy();

        }


        public void Paste()

        {

            this.richTextBox1.Paste();

        }


        public void SelectAll()

        {

            this.richTextBox1.SelectAll();

        }


        public void FontDialog()

        {

            FontDialog fontDialog = new FontDialog();

            if (fontDialog.ShowDialog() != DialogResult.Cancel)

              {

                  this.richTextBox1.Font = fontDialog.Font;

              }

        }


        public void ColorDialog()

        {

            ColorDialog colorDialog = new ColorDialog();

            if (colorDialog.ShowDialog() != DialogResult.Cancel)

                {

                    this.richTextBox1.ForeColor = colorDialog.Color;

                }

        }


        public void richTextBox1_TextChanged(object sender, EventArgs e)

        {

            textchangedAndNotSaved = true;

            this.SetFormTitle();

            //toolStripStatusLabel1.Text = "Texteditor - Statusbar";

        }


        private void SaveToFile()

        {

            try

            {

                StreamWriter sw = new StreamWriter(strFile, false);

                sw.Write(richTextBox1.Text);

                sw.Close();

            }

            catch (Exception e)

            {

                MessageBox.Show(e.Message);

                return;

            }

            this.textchangedAndNotSaved = false;

        }


        private void SaveDocument()

        {

            if (this.strFile != null && this.strFile.Length > 0)

                saveFileDialog1.FileName = this.strFile;

            saveFileDialog1.Filter = "Textdateien (*.txt)|*.txt|"

                                    + "Alle Dateien (*.*)|*.*";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)

            {

                this.strFile = saveFileDialog1.FileName;

                this.SaveToFile();

            }

            this.SetFormTitle();

        }


        public void SetFormTitle()

        {

            if (this.strFile == null || this.strFile.Length == 0)

                this.Text = "Unbekannt";

            else

                this.Text = Path.GetFileName(this.strFile);


            if (this.textchangedAndNotSaved == true)

            {

                if (this.strFile == null || this.strFile.Length == 0)

                    this.Text = "Unbekannt" + "*";

                else

                    this.Text = Path.GetFileName(this.strFile) + "*";

            }

        }


        public void OpenTextFile(string Filename)

        {

            richTextBox1.LoadFile(Filename);

        }


        private void OpenFile(object sender, EventArgs e)

        {

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

            openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";

            if (openFileDialog.ShowDialog(this) == DialogResult.OK)

            {

                string FileName = openFileDialog.FileName;

                if (System.IO.File.Exists(FileName))

                {


                    Form2 child = new Form2();

                    child.MdiParent = this;

                    child.OpenTextFile(FileName);

                    child.Show();

                }

            }

        }


        private bool saveQuestion(bool last)

        {

            if (textchangedAndNotSaved)

            {

                DialogResult dr = MessageBox.Show("Der Text wurde verändert!\n\nAktuelle Änderung speichern?",

                                                    "Speichern", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,

                                                     MessageBoxDefaultButton.Button1);

                if (dr == DialogResult.Yes)

                {

                    saveText();

                    if (last)

                        this.Dispose();

                    return true;

                }

                else if (dr == DialogResult.No)

                {

                    if (last)

                        this.Dispose();

                    else

                        return true;

                }

                else if (dr == DialogResult.Cancel)

                    return false;

            }

            else

                if (last)

                    this.Dispose();

            return false;

        }


        private bool saveText()

        {

            bool success = false;

            SaveFileDialog saveFile = new SaveFileDialog();

            saveFile.Filter = fileFilter;

            DialogResult dr = saveFile.ShowDialog();


            if (dr == DialogResult.OK)

            {

                string path = saveFile.FileName.ToString();



                try

                {

                    StreamWriter sw = new StreamWriter(path);

                    sw.Write(richTextBox1.Text);

                    sw.Flush();

                    sw.Close();

                    success = true;

                    textchangedAndNotSaved = false;

                }

                catch (Exception)

                {

                    success = false;

                }

            }


            return success;

        }


        private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

        if (!saveQuestion(true))

        e.Cancel = true;

        }


    }

}

Vielen Dank für eure Hilfe :)

Nachtrag: Ach ja, wie kann ich vom Child Form auf den toolStripStatusLabel1.Text im Parent Form zugreifen?

Bearbeitet von Nadine19
Link zu diesem Kommentar
Auf anderen Seiten teilen

Generell: Schau Dir mal in der Hilfe zum MdiParent an!

Wenn man noch kein Child geöffnet hat und auf "Öffnen" klickt soll sich die ausgesuchte Datei in einem neuen Child öffnen

Es gibt die Property MdiChildren. Die Laenge gibt an, wiviele Children vorhanden sind. Also:

if (MdiChildren.Length == 0)

Wenn man eine txt Datei öffnen möchte, diese aber schon geöffnet ist, soll man zu der Geöffneten weitergeleitet werden und somit nicht "doppelt öffnen" können

Erstell Dir eine Liste in der Du die Dateinamen speicherst.

Wenn Der Dateiname noch nicht in der Liste ist, fuegst Du den Dateinamen hinzu. Wenn er noch nicht vorhanden war, dann erstellst Du ein neues Child.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo genau füge ich dieses


if (MdiChildren.Length == 0)

ein? Hier in der Child Form?

        public void Oeffnen()

        { 

            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = fileFilter;

            DialogResult dr = openFile.ShowDialog();

            saveQuestion(false);


            if (dr == DialogResult.OK)

            {

                richTextBox1.Clear();

                string path = openFile.FileName;

                StreamReader sr = new StreamReader(path);

                string line = "";

                while ((line = sr.ReadLine()) != null)

                {

                    richTextBox1.Text += line + "\n";

                }


                this.strFile = openFile.FileName;

                textchangedAndNotSaved = false;

                this.SetFormTitle();

                sr.Close();

            }

        }

Oder hier in der Parent Form?

        void menuLaden_Click(object sender, EventArgs e)

        {

            ((Form2)ActiveMdiChild).Oeffnen();

        }

Ich glaube du hast eben meinen Nachtrag übersehen, hier ist er nochmal:

Wie kann ich vom Child Form auf den toolStripStatusLabel1.Text im Parent Form zugreifen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...