Nadine19 Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 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#! Zitieren
Guybrush Threepwood Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 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. Zitieren
Nadine19 Geschrieben 1. Dezember 2009 Autor Geschrieben 1. Dezember 2009 Wie genau soll ich das anstellen? Ich hab in meiner Parent Form min. 25 mal this.richTextBox1 stehen. Soll ich das zu Program.frm2.richTextBox1 ändern? Zitieren
Guybrush Threepwood Geschrieben 1. Dezember 2009 Geschrieben 1. Dezember 2009 Nein du hast ja nicht nur eine Instanz von Form2 sondern soviele wie halt Dokumente geöffnet sind Zitieren
Nadine19 Geschrieben 1. Dezember 2009 Autor Geschrieben 1. Dezember 2009 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); } } } Zitieren
.NETter Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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 Zitieren
Nadine19 Geschrieben 2. Dezember 2009 Autor Geschrieben 2. Dezember 2009 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. Zitieren
Pointerman Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 .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. Zitieren
Nadine19 Geschrieben 2. Dezember 2009 Autor Geschrieben 2. Dezember 2009 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. Wie genau funktioniert dieses übergeben? Zitieren
Pointerman Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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! Zitieren
.NETter Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 Ich hoffe dass wir nun alle Klarheiten beseitigt haben Nein, nein! Wenn noch Du noch etwas Hilfe benötigst einfach schreiben! Gruß, Thomas Zitieren
Nadine19 Geschrieben 2. Dezember 2009 Autor Geschrieben 2. Dezember 2009 Hab es jetzt so abgeändert wie Pointerman es geschrieben hat. Bloß wie ändern ich jetzt jedes meiner 25 this.richTextBox1 darauf ab? Zitieren
.NETter Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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 Zitieren
Nadine19 Geschrieben 2. Dezember 2009 Autor Geschrieben 2. Dezember 2009 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... Zitieren
Pointerman Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 (bearbeitet) 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 2. Dezember 2009 von Pointerman Zitieren
0815FIA Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 Vielleicht hilft dir dieses Beispiel weiter: CodeProject: Introduction to MDI Forms with C#. Free source code and programming help Zitieren
Guybrush Threepwood Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 Naja nicht ganz. Das Speichern sollte imho schon im Parentform bleiben. Die kann sich dei Daten ja dann vom Child holen Zitieren
Pointerman Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 @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? Zitieren
Guybrush Threepwood Geschrieben 2. Dezember 2009 Geschrieben 2. Dezember 2009 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 Zitieren
Pointerman Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 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. Zitieren
Nadine19 Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 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(); Zitieren
Pointerman Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 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. Zitieren
Nadine19 Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 (bearbeitet) Super, jetzt funktioniert soweit alles 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 3. Dezember 2009 von Nadine19 Zitieren
Pointerman Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 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. Zitieren
Nadine19 Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 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? Zitieren
Empfohlene Beiträge
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.