C# SaveFileDialog öffnet sich auch beim normalen Speichern (kleiner Texteditor)

Red Sun

Lt. Commander
Registriert
Dez. 2010
Beiträge
1.141
Hi Folks!

Also, seit kurzer Zeit beschäftige ich mich betrieblich mit C# (Ich bin Student und habe jetzt meine Praxisphase... naja, nebensächlich).
Hierfür habe ich die ein oder Schulungsunterlage. In einer davon ist ein Übungsprojekt zu einem kleinen Texteditor
(Um den Umgang mit Dateien und Streams zu üben bzw. lernen).

Wie auch immer, ich bin jetzt eigentlich soweit, dass ich Dateien öffnen & speichern kann. Wenn ich jedoch eine bereits vorhandene Datei speichern will, öffnet sich trotz allem noch der SaveFileDialog und das soll ja normalerweise nicht sein.

Ich habe schon so einiges rumprobiert, verstehe aber einfach nicht wo der Fehler liegt. Laut PDF müsste es eigentlich funktionieren...

Und bitte entschuldigt falls der programmier-Stil irgendwie schlecht ist, wie gesagt, bin noch Anfänger... ;)
Ratschläge nehme ich aber gerne entgegen!

Ich hoffe ihr könnt mir irgendwie helfen damit:

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;

namespace Dateien_und_Streams
{
    public partial class Form1 : Form
    {
        string strFileLocation = null; // enthält Information über den Speicherort der Textdatei
        
        public Form1()
        {
            InitializeComponent();
            SetFormTitle();
        }


        // Ereignishandler des Klick-Ereignisses "Öffnen"
        private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            {
                OpenFileDialog dlgOpenTxt = new OpenFileDialog();
                dlgOpenTxt.Title = "Textdatei öffnen";
                dlgOpenTxt.Filter = "Textdateien (*.txt)|*.txt";
                if (dlgOpenTxt.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        StreamReader srOpenTextFile = new StreamReader(dlgOpenTxt.FileName);
                        txtMainText.Text = srOpenTextFile.ReadToEnd();
                        strFileLocation = dlgOpenTxt.FileName;  // 
                        SetFormTitle();                         // Titel der Form anpassen.
                        srOpenTextFile.Close();
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Texteditor");
                    }
                }
            }
        }
        // Methode zum Speichern des Textboxinhalts (Textboxinhalt wird an einen Stream übergeben)
        public void SaveToFile()
        {
            try
            {
                StreamWriter swSaveTextFile = new StreamWriter(strFileLocation, false);
                swSaveTextFile.Write(txtMainText.Text);
                swSaveTextFile.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
            txtMainText.Modified = false;
        }

        // Methode zum Überprüfen ob Inhalt der Textbox bereits gespeichert ist
        private void DocumentSaved()
        {
            SaveFileDialog dlgSaveText = new SaveFileDialog();
            dlgSaveText.Filter = "Textdatei (*.txt)|*.txt";
            dlgSaveText.AddExtension = true;
            dlgSaveText.DefaultExt = "txt";
            if (strFileLocation != null && strFileLocation.Length > 0)
            {
                dlgSaveText.FileName = strFileLocation;
            }
            if (dlgSaveText.ShowDialog() == DialogResult.OK)
            {
                strFileLocation = dlgSaveText.FileName;
                SaveToFile();
                SetFormTitle();
            }
        }

        // Methode um Dateinamen in der Titelleiste anzuzeigen
        private void SetFormTitle()
        {
            if (strFileLocation == null || strFileLocation.Length == 0)
            {
                this.Text = "Unbenannt - " + "Texteditor";
            }
            else
            {
                this.Text = Path.GetFileName(strFileLocation) + " - " + "Texteditor";
            }
        }

        // Ereignishandler des Klick-Ereignisses "Speichern"
        private void speichernToolStripMenuItem_Click(object sender, EventArgs e)
        {
           if (strFileLocation == null || strFileLocation.Length == 0)
           {
               DocumentSaved();
           }
           else
           {
                SaveToFile();
           }            
        }

        // Ereignishandler des Klick-Ereignisses "Speichern unter..."
        private void speichernUnterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DocumentSaved();
        }

        // Ereignishandler des Klick-Ereignisses "Beenden"
        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult exit = MessageBox.Show("Wollen sie wirklich beenden?\nAlle nicht gespeicherten Änderungen gehen verloren!", "Anwendung beenden",
                                MessageBoxButtons.OKCancel,
                                MessageBoxIcon.Question);
            if (exit == DialogResult.OK)
            {
                Application.Exit();
            }
            else 
            {
                   // Abbrechen...
            }
        }
    }
}

Achja, dass Ganze ist natürlich mit einer Windows-Form realisiert..

Grüße, Red Sun
 
Naja ohne zu wissen, wie die Event-Listener verdrahtet sind, kann man auch nur raten...

Und wieso fragst du keinen Betreuer?
 
Schon mal mit dem Debugger gearbeitet ;)? Verfolge mal den Ablauf deines Programms ab dem Beginn von "speichernToolStripMenuItem_Click" und schau dir dabei die Variablen bei den ifs an, ob die auch deinen Erwartungen entsprechen.
 
Also ich rate jetzt mal nur ein bisschen wild rum. Es ist nicht so einfach durch den Code zu steigen. Das ist keine Kritik sondern liegt in der Natur der Sache. ;) Ich hätte vielleicht nicht, WinForms als Technologie gewählt um das Handling von Dateien und Streams zu erlernen.

Code:
 // Ereignishandler des Klick-Ereignisses "Speichern"
private void speichernToolStripMenuItem_Click(object sender, EventArgs e)
{
     if (strFileLocation == null || strFileLocation.Length == 0)
     {
          DocumentSaved();
     }
     else
     {
          SaveToFile();
     }
}

Da in dieser Methode nur der Pfad über "DocumentSaved()" den Dialog enthält, scheint eine der Variablen entweder "null" oder halt "0" zu sein.

Hast du mal den Debugger bemüht?

Ansonsten ein bisschen konstruktive Kritik...mixe niemals die Sprachen in deinem Code. Das zerstört nur die Lesbarkeit.

Ich würde mir angewöhnen nur auf Englisch zu programmieren, da du später auch schnell mal mit nichtdeutschsprachigen Programmierern zusammenarbeiten wirst.
Hinzukommt, dass Bezeichnungen in Deutsch schnell fehlinterpretiert werden können. Englisch ist da meiner Meinung nach viel eindeutiger.
 
Zuletzt bearbeitet:
auf anhieb sehe ich dort auch keinen Fehler also mit dem Debugger arbeiten. Wenn du willst kannst du ja mal den Projekt Ordner hochladen.
 
1668mib schrieb:
Und wieso fragst du keinen Betreuer?

Grade nicht da :p

@iks-deh: Hm joa, ich guck mal ob ich so weiterkomme.. :) Wäre ja am besten wenn ich es selbst rauskriege.

@DHN: Ok, werde ich mir merken. Ist halt in dem Schulungs-PDF auch so :D
Ergänzung ()

Also, der Debugger hat geholfen :D

Er springt, warum auch immer, in den falschen Event-Handler... naja, nichts für ungut ;)

Wenigstens was gelernt.
 
Dass er in den falschen Handler springt, ist doch schon ohne Debugger relativ klar gewesen, nicht grundlos schrieb ich "Naja ohne zu wissen, wie die Event-Listener verdrahtet sind, kann man auch nur raten".
Die Namen sagen schließlich nichts darüber aus, wer wo zugeordnet wurde...
 
Zurück
Oben