我有以下代码:
打开文件代码
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;
}
}
SaveFileAs Code
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事件(即使文本已被修改)。如何点击“打开”,它会询问我是否要保存(如果文本被修改)。然后,如果我点击取消,它会将我返回到表单?
对不起。我是编程新手,所以这是一个学习曲线。
答案 0 :(得分:6)
好的,我想我知道这里发生了什么。首先,我不相信return;
以你认为的方式运作。
if (ofd.ShowDialog() != DialogResult.Yes) return;
{
NewFile();
}
如果显示对话框不是,则会发生return;
调用。 { newFile() }
代码不需要围绕它。所以那些线条真的是:
if (ofd.ShowDialog() != DialogResult.Yes) return;
NewFile();
现在,根据您的要求,无论如何,NewFile在游戏中被称为WAY。在你问他们要打开什么之前,你希望这种情况发生;就像大多数其他Windows程序一样。
但是,还有另一个问题。 NewFile方法中的return
语句只是从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;
}
答案 1 :(得分:2)
问题在于:
if (ofd.ShowDialog() != DialogResult.Yes) return;
{
NewFile();
}
删除return
。但是,正如@Chris所说,您应该询问是否保存当前文件,然后用户选择要打开的新文件。