我该怎么做才能在用户点击取消时取消对话框?

时间:2013-04-04 00:15:24

标签: c# winforms visual-studio-2012 openfiledialog

我有以下代码:

打开文件代码

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事件(即使文本已被修改)。如何点击“打开”,它会询问我是否要保存(如果文本被修改)。然后,如果我点击取消,它会将我返回到表单?

对不起。我是编程新手,所以这是一个学习曲线。

2 个答案:

答案 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所说,您应该询问是否保存当前文件,然后用户选择要打开的新文件。