在显示消息框后,如何更改表单的文本?

时间:2013-08-16 02:07:30

标签: c# winforms messagebox

我正在制作一个记事本程序而且我遇到了问题;在我的New按钮上,我有以下代码:

private void New()
    {
        if (us == true)
        {
            DialogResult dr = MessageBox.Show("Do you want to save changes to: " + filepath, "Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
            if (dr == DialogResult.Yes)
                Save();
            else if (dr == DialogResult.No)
            {
                filename = null;
                undoToolStripMenuItem.Enabled = false;
                undoToolStripMenuItem1.Enabled = false;
                redoToolStripMenuItem.Enabled = false;
                redoToolStripMenuItem1.Enabled = false;
                us = false;
                Form1.ActiveForm.Text = "Untitled - PadNotePro";
                richTextBox1.Clear();
            }
            else if (dr == DialogResult.Cancel)
                Close();
        }
        else
        {
            filename = null;
            undoToolStripMenuItem.Enabled = false;
            undoToolStripMenuItem1.Enabled = false;
            redoToolStripMenuItem.Enabled = false;
            redoToolStripMenuItem1.Enabled = false;
            Form1.ActiveForm.Text = "Untitled - PadNotePro";
            richTextBox1.Clear();
        }
    }

us表示未保存,是查看是否已保存,如果us = true,则表示未保存。

当我在DialogBox上点击否时,它会运行以下代码:

else if (dr == DialogResult.No)
            {
                filename = null;
                undoToolStripMenuItem.Enabled = false;
                undoToolStripMenuItem1.Enabled = false;
                redoToolStripMenuItem.Enabled = false;
                redoToolStripMenuItem1.Enabled = false;
                us = false;
                Form1.ActiveForm.Text = "Untitled - PadNotePro";
                richTextBox1.Clear();
            }

我遇到的问题是:Form1.ActiveForm.Text = "Untitled - PadNotePro";,似乎它正在跳过这行代码。我认为这与MessageBox有关,但无法弄清楚。有谁知道为什么?

编辑: 我认为这可能与Form当时没有活动有关。

3 个答案:

答案 0 :(得分:1)

我自己已经弄明白了。您无法在Form的代码中为MessageBox运行代码。您必须使用BackgroundWorker。作为参考,这是我使用的代码:

BackgroundWorker changeformtext = new BackgroundWorker();
public Form1()
{
    InitializeComponent();
    changeformtext.DoWork += changeformtext_DoWork;
}
void changeformtext_DoWork(object sender, DoWorkEventArgs e)
{
    Invoke(new Action(doit));
}
void doit()
{
    this.Text = "Untitled - PadNotePro";
}
private void New()
{
    if (us == true)
    {
        DialogResult dr = MessageBox.Show("Do you want to save changes to: Untitled?", "Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
        if (dr == DialogResult.Yes)
            Save();
        else if (dr == DialogResult.No)
        {
            changeformtext.RunWorkerAsync();
        }
        else if (dr == DialogResult.Cancel)
            Close();
    }
    else
    {
        changeformtext.RunWorkerAsync();
    }
}

答案 1 :(得分:0)

字段/属性'ActiveForm'返回什么?我们将无法回答您的问题,除非您向我们提供有关问题是什么/您获得的错误的更多信息。

编辑:

使用此方法更改表单的文本:

    public void ChangeFormText(Form form, string text)
    {
        form.Text = text;
    }

答案 2 :(得分:0)

您不应该在Form1上调用静态属性。而是使用instance属性来访问标题:

this.Text = "Untitled - PadNotePro";

似乎“活动表单”成为MessageBox而不是表单本身。此外,在当前对象上使用实例方法而不是通过静态属性到达同一位置通常是一种很好的OOP实践。