C# String an andere Form übergeben

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
595
Hallo zusammen

Ich habe folgendes Problem. Ich bin daran einen HTML - Editior zu schreiben. Soweit so gut.
Nun möchte ich der Übersicht halber ein paar Einstellmöglichkeiten in eine neue Form auslagern(Farbe, Schriftart usw).

Nun habe ich in FormMain den Pfad für eine CSS datei in einem String (csssource) gespeichert. In FormSettings (dem zweiten Forms) möchte ich gerne diesen String verwenden, um die Einstellungen in die CSS zu schreiben.

Ich habe mit Get und Set usw alles probiert. Ich kann nunmehr in FormSettings den String mit Hauptform.csssource ansprechen, jedoch hat diesser String keinen Wert und so ergibt es eine Nullexception.

In FormMain hat der String beim Ausführen aber definitiv einen Inhalt.
Es scheint also so, als würde der Wert von csssource nicht an die andere Form (FormSettings) übergeben.

Hier der Übersicht mal den Kompletten Code:


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.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();
        }

    }
}

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; }

        private FormMain Hauptform; 
        public FormSettings()
        {
            InitializeComponent();
            //Hauptform = new FormMain();
        }

        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(Hauptform.csssource);
            //StreamWriter sw = File.CreateText(Hauptform.csssource);
            //sw.Write("teste");
            //StreamWriter myFile = new StreamWriter(Hauptform.csssource);
            //myFile.Write(HTMLFarbe);
            //myFile.Close();

        }

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

Hier ein Bild von dem Frontend:
Klick



Ich bin wirklich am verzweifeln und komme nichct mehr weiter.
Hoffe ihr seht den Fehler und könnt mir helfen :)
 
Zuletzt bearbeitet:
Du musst in FormSettings eine Referenz auf dein aktives Fenster speichern. Wenn du dort (das auskommentierte) new FormMain benutzt, erhälst du die Instanz für ein zweites Fenster dieser Art! Also übergebe z.B. beim Erstellen von FormSettings in FormMain eine Referenz auf die FormMain mit dem this-Schlüsselwort.
 
Das der Wert null ist liegt daran, dass du in FormSettings ein neues Objekt von FormMain erstellst und es somit keine Werte hat.

Lösen könntest du es darüber, dass du das FormMain-Objekt an FormSettings übergibts oder du erstellst in FormSettings noch ein Get/Set für den csssource und übergibst den String vorm aufruf an die Form;

Code:
// beim öffnen
Grundeinstellungen.CssSource = this.csssource;

// wenn die Settings geschlossen werden
if(Grundeinstellungen.ShowDialog() == DialogResult.OK)
{
   this.cssource = Grundeinstellungen.CssSource;
}
Grundeinstellungen.Dispose();
 
Zuletzt bearbeitet:
Code:
private void button_einrichten_Click(object sender, EventArgs e)
{
  Grundeinstellungen.cssource = cssource;
}

public partial class FormSettings : Form
{
  public string cssource { get; set; }
}
Du überträgst einfach die Variable in die neue Form und verwendest die eigene. Beim Weiterarbeiten daran denken, die Variable evtl. wieder zu aktualisieren.
 
wenn ich bei button_einrichten
Grundeinstellungen.csssource = csssource;

Mache, kommt der Fehler: "HTML_CodeGenerator.FormSettings enthält keine Definition für csssource
 
Du brauchst in FormSettings natürlich noch

Code:
public string cssource { get; set; }
 
Jetzt habe ich zwar keine Fehler mehr, aber beim Debugging kommt der fehler:
System.StackOverflowException wurde nicht behandelt.


Und das ganze jetzt in der FormSettings.designer.cs.. o.O
 
hmm.. Möglich wäre ein Ringbezug auf div. Controls. Aber so genau kann man das jetzt glaube nicht sagen :/

Hast du das von mir mit dem DialogResult implementiert?
 
Zuletzt bearbeitet:
Oha.. und wie soll ich (dieses für mich extrem relevante programm) debuggen?

Kann mir niemand die Codesequenzen posten, die ich einfügen kann?
es geht nicht darum, dass ich zu Faul bin um zu suchen/ausprobieren, aber 1. Bin ich schon seit 2 Tagen daran und zweitens wenn ich dieses Projekt zerschiesse, habe ich ein grosses Problem.


EDIT:
mir ist nicht klar, was du mit dem Dialogresult willst?

Das Grundeinstellungen.ShowDialog habe ich ja im Code oben auskommentiert. Mit dieser Funktion konnte ich das im FormSetting vorhandene ColorDialog und Fontdialog aufrufen, ohne dass die FormSetting angezeigt wird (zumindest erst am schluss).

Da es aber Mühsam ist, wenn zuerst der ColorDialog, dann noch der Fontdialog usw nacheinander kommt und ich lieber auf einen Button klicken möchte, dass der Fontdialog erscheint, habe ich diese Möglichkeit wider auskommentiert.

EDIT2:
Ich öffne mit dem Grundeinstellungen.Show(); die FormSettings. in dieser kleinen Form möchte ich eine Farbe definieren und eine Schriftart. Beides soll in einer Variable (in der FormSettings) gespeichert werden. Zudem soll gleich der Wert von Farbe und Schriftart in eine CSS - Datei geschrieben werden.

Der Pfad zur CSS - Datei wurde aber schon in der FormMain festgelegt und in der Variable "csssource" gespeichert.

Damit ich in der FormSettings weiss, wohin und in welche Datei ich speichern muss, muss ich im Formsettings die Variable "csssource" aus der FormMain angeben.
Grundsätzlich brauche ich ja nur einen String, der der Wert von FormMain auch in FormSettings gültig ist..
 
Zuletzt bearbeitet:
Dann läuft irgendwas im Designer schief. Poste doch mal die Stelle wo es auftritt, dann kann man dir auch helfen.
 
Atreju93 schrieb:
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();
        }

    }
}

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
    {
        private string cssstring;

        public string HTMLFarbe { get; set; }
        public Font SchriftArt { get; set; }

        public string CssSource
        {
             get { return csssource; }
             set { csssource = value; }
         }

        private FormMain Hauptform; 
        public FormSettings()
        {
            InitializeComponent();
            //Hauptform = new FormMain();
        }

        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(Hauptform.csssource);
            //StreamWriter sw = File.CreateText(Hauptform.csssource);
            //sw.Write("teste");
            //StreamWriter myFile = new StreamWriter(Hauptform.csssource);
            //myFile.Write(HTMLFarbe);
            //myFile.Close();

        }

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

So sollte es jetzt aber funktionieren

Ansonsten hast du was im Designer zerschossen ^^, einfach posten und dann kann mans lösen denk ich
 
Ich habe mal hier den Downloadlink zum Projektordner gemacht...

Visual Studio Express 2008

Klick

EDIT:
Danke für den Vorschlag, ich wurde leider aus Zeitgrunden aus der Firma geschossen (17.00Uhr - Ladenschluss) und kann daher erst morgen ausprobieren, ob es funktioniert :)

Gruss
 
Zuletzt bearbeitet:
Ohh man, es ist wieder spät und ich bin mir nicht so ganz sicher ob ich das Problem ganz richtig erkannt habe ^^. Aber wenn dann ist es folgendes:

Dein zweites Fenster braucht eine Info aus deinem Hauptfenster damit es arbeiten kann
Wenn das Falsch ist, ist folgender Lösungsansatz nicht weiter Relevant ;)

Gib einfach dem Konstrukter die nötigen Infos mit und speicher die geschichte. Im Klartext:

Code:
string csssource;

public FormSettings(string csssource) // wenn ich es richtig gesehen habe ist es der Pfad als string
        {
            InitializeComponent();
            this.csssource = csssource;
        }

vielleicht konnte ich helfen ;)
 
EDIT:
Zu Früh gefreut, der String csssource in FormSettings ist immer noch leer :(

Der fehler ist nun "Fehler 1 "HTML_CodeGenerator.FormSettings" enthält keinen Konstruktor, der 0-Argumente akzeptiert.

EDIT2:
Nun funktioniert es!
Aber ich habe keinen Plan wieso. Ich habe mit Ctrl - Z alles wider rückgängig gmeacht und siehe da, plötzlich bekam der String csssource in FormSettings den Wert von FormMain. Wieso auch immer..

Vielen Dank für die Hilfe :)
 
Zuletzt bearbeitet:
Atreju93 schrieb:
EDIT:
Zu Früh gefreut, der String csssource in FormSettings ist immer noch leer :(

Der fehler ist nun "Fehler 1 "HTML_CodeGenerator.FormSettings" enthält keinen Konstruktor, der 0-Argumente akzeptiert.

Das kommt dadurch, das du den Konstrukter in FormSettings nun den Pfad übergibst, in der Main war der Aufruf wahrscheinlich noch
Code:
new HTML_CodeGenerator.FormSettings();
// diesem musst du jetzt deinen Pfad übergeben
new HTML_CodeGenerator.FormSettings(Pfad)// deine Varible eben ;)
 
Zurück
Oben