1

我有以下代码:

打开文件代码

OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Open File";
        ofd.FileName = "";
        ofd.Filter = "Rich Text Files (*.rtf)|*.rtf|Text Document (*.txt)|*.txt|Microsoft Word Document (*.doc)|*.doc|Hypertext Markup Language Document (*.html)|*.html"; StreamReader sr = null;
        if (ofd.ShowDialog() != DialogResult.Yes) return;
        {
            NewFile();
        }
        try
        {

            sr = new StreamReader(ofd.FileName);
            this.Text = string.Format("{0} - Basic Word Processor", Path.GetFileName(ofd.FileName));
            richTextBoxPrintCtrl1.Text = ofd.FileName;
            richTextBoxPrintCtrl1.Text = sr.ReadToEnd();
            filepath = ofd.FileName;
            richTextBoxPrintCtrl1.LoadFile(fileName, RichTextBoxStreamType.RichText);

        }
        catch
        {
        }
        finally
        {
            if (sr != null) sr.Close();
        }

新文件代码

if (richTextBoxPrintCtrl1.Modified)
        {
            DialogResult r = MessageBox.Show(this, "Save Current Document?", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
            if (r == DialogResult.Yes) SaveFile();
            if (r == DialogResult.Cancel) return;
        }
        this.Text = string.Format("Untitled - Basic Word Processor");
        richTextBoxPrintCtrl1.Text = "";
        filepath = null;
    }
    }

将文件另存为代码

SaveFileDialog sfdSaveFile = new SaveFileDialog();
        sfdSaveFile.Title = "Save File";
        sfdSaveFile.FileName = "Untitled";
        sfdSaveFile.Filter = "Rich Text Files (*.rtf)|*.rtf|Text Document (*.txt)|*.txt|Microsoft Word Document (*.doc)|*.doc|Hypertext Markup Language Document (*.html)|*.html";
        if (sfdSaveFile.ShowDialog() == DialogResult.OK)
            try
            {
                filepath = sfdSaveFile.FileName;
                SaveFile();
                this.Text = string.Format("{0} - Basic Word Processor", Path.GetFileName(sfdSaveFile.FileName));
            }
            catch (Exception exc)
            {

            }

保存文件代码

        if (filepath == null)
        {
            SaveFileAs();
            return;

        }
        StreamWriter sw = new StreamWriter(filepath);
        //StreamWriter stwrite = null;
        try
        {

            sw.WriteLine(richTextBoxPrintCtrl1.Text);
            richTextBoxPrintCtrl1.Modified = false;
            sw.Close();

        }
        catch (Exception e)
        {
            MessageBox.Show("Failed to save file. \n" + e.Message);
        }
        finally
        {
            if (sw != null) sw.Close();
        }

目前,程序会跳过 NewFile 事件(即使文本已被修改)。我怎样才能做到这一点,当我单击“打开”时,它会询问我是否要保存(如果文本被修改)。然后,如果我单击取消,它会返回到表单吗?

对不起。我对编程真的很陌生,所以这都是一个学习曲线。

4

2 回答 2

6

好吧,我想我明白这里发生了什么。首先,我不相信return;你认为它的工作方式。

if (ofd.ShowDialog() != DialogResult.Yes) return;
        {
            NewFile();
        }

return;如果显示对话框不是“是”,您就会接到一个电话。{ newFile() }代码不需要大括号。所以这些行真的是:

if (ofd.ShowDialog() != DialogResult.Yes) return;

NewFile();

现在,鉴于您的要求,无论如何在游戏中调用 NewFile 为时已晚。你希望在你问他们打开什么之前发生这种情况;就像大多数其他 Windows 程序一样工作。

但是,还有一个问题。您return在 NewFile 方法中的语句只是从 NewFile 返回。它并没有告诉以前的方法来纾困。

所以 NewFile 方法需要一个返回类型来指示是否允许调用方法前进。

而且,查看您的保存文件,您也有一个返回方法。所有的return;电话是怎么回事?

这让我们回到了如何解决这个问题?

答:重写整个事情。从以下方法开始:

private Boolean CanClear() {
    Boolean result = false;
    if (richTextBoxPrintCtrl1.Modified)
    {
        DialogResult r = MessageBox.Show(this, "Save Current Document?", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
        if (r == DialogResult.Yes) {
            SaveFile();
            result = true;
        }
    } else {
        result = true;
    }  
    return result;
}

现在,在您的 Open 和 New 文件方法中执行以下操作(假设这些是方法头)

protected void OpenFile(...) {
    if (!CanClear()) return;
    .... now execute the code to load the open dialog and the selected file.
}

protected void NewFile(...) {
    if (!CanClear()) return;

    this.Text = string.Format("Untitled - Basic Word Processor");
    richTextBoxPrintCtrl1.Text = "";
    filepath = null;
}
于 2013-04-04T00:34:00.997 回答
2

问题在这里:

    if (ofd.ShowDialog() != DialogResult.Yes) return;
    {
        NewFile();
    }

删除那个return。但是,正如@Chris 所说,您应该在用户选择要打开的新文件之前询问是否保存当前文件。

于 2013-04-04T00:30:52.013 回答