views:

184

answers:

1

This question has been answered. I've improved the code a bit (at least I think so). It now reminds of the aceepted answer to the question Open file in rich text box with C#. If I haven't made any mistakes (which I may have), the code should save a file with text from the rich text box rtfMain. The default file extension is .txt. You can also use the file extension .rtf.

private void menuFileSave_Click(object sender, EventArgs e) 
{ 
// Create a new SaveFileDialog object 
using (SaveFileDialog dlgSave = new SaveFileDialog())
  try
  {
    // Default file extension
    dlgSave.DefaultExt = "txt"; 
    // SaveFileDialog title
    dlgSave.Title = "Save File As";
    // Available file extensions
    dlgSave.Filter = "Text Files (*.txt)|*.txt|RTF Files (*.rtf)|*.rtf"; 
    // Show SaveFileDialog box and save file
    if (dlgSave.ShowDialog() == DialogResult.OK) 
    { 
      // Save as .txt file
      if (Path.GetExtension(dlgSave.FileName) == ".txt")
      {
        rtfMain.SaveFile(dlgSave.FileName, RichTextBoxStreamType.PlainText);
      }
      // Save as .rtf file
      if (Path.GetExtension(dlgSave.FileName) == ".rtf")
      {
        rtfMain.SaveFile(dlgSave.FileName, RichTextBoxStreamType.PlainText);
      }
    }
    catch (Exception errorMsg)
    {
      MessageBox.Show(errorMsg.Message);
    }
  }
}
private void rtfMain_TextChanged(object sender, EventArgs e)
{
}

Update: I have improved the code even further (at least I think so). The main difference is that you now have more control over the file encoding. This is the code I'm using right now:

private void fileSave_Click(object sender, EventArgs e)
{
  // Text from the rich textbox rtfMain
  string str = rtfMain.Text;
  // Create a new SaveFileDialog object
  using (SaveFileDialog dlgSave = new SaveFileDialog())
  try
  {
    // Available file extensions
    dlgSave.Filter = "All Files (*.*)|*.*";
    // SaveFileDialog title
    dlgSave.Title = "Save";
    // Show SaveFileDialog
    if (dlgSave.ShowDialog() == DialogResult.OK && dlgSave.FileName.Length > 0)
    {
      // Save file as utf8 without byte order mark (BOM)
      // ref: http://msdn.microsoft.com/en-us/library/s064f8w2.aspx
      UTF8Encoding utf8 = new UTF8Encoding();
      StreamWriter sw = new StreamWriter(dlgSave.FileName, false, utf8);
      sw.Write(str);
      sw.Close();
    }
  }
  catch (Exception errorMsg)
  {
    MessageBox.Show(errorMsg.Message);
  } 
}
+3  A: 

Like this:

 rtfMain.SaveFile(dlgSave.FileName);
SLaks
SLaks way is the easiest. But to get your own code running, you could add writeMe.Flush() after writing to it.
Hinek
Thank you! Where do I put your code? I tried every position I could think of, but nothing worked.
matsolof
Do you know what each line of code does?
SLaks
No. I'm a C# beginner. I'm just trying to make some basic code work and continue from there. Having a couple of years experience of PHP, that seems to remind a lot of C#, I think that's a good idea. Earlier today, I managed to get an open file dialog to work. Now I'm trying to do the same with a save file dialog.
matsolof
Just to clarify, I understand perhaps 50 % of the code.
matsolof
Put it after `if (dlgSave.ShowDialog() == DialogResult.OK)` and remove the rest of the method, then learn C#.
SLaks
That worked! Thanks!!
matsolof
Then you should accept this answer by clicking the hollow check.
SLaks
I know. I forgot to do it. Sorry about that. It's fixed now.
matsolof