C# 如何更改我的表单';在我显示消息框后,是否显示文本?

C# 如何更改我的表单';在我显示消息框后,是否显示文本?,c#,winforms,messagebox,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

我正在做一个记事本程序,我有一个问题;在我的
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();
        }
    }
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();
            }
us
表示未保存,查看是否保存,如果us=true,则不保存

当我在我的
对话框中单击“否”时,它会运行以下代码:

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();
        }
    }
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”,它似乎跳过了那行代码。我认为这与
消息框
有关,但无法理解。有人知道为什么吗

编辑:
我认为这可能与
表单当时不处于活动状态有关。

字段/属性“ActiveForm”返回什么?我们无法回答您的问题,除非您提供更多有关问题/错误的信息

编辑:

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

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

字段/属性“ActiveForm”返回什么?我们无法回答您的问题,除非您提供更多有关问题/错误的信息

编辑:

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

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

您不应该调用Form1的静态属性。相反,请使用instance属性访问标题:

this.Text = "Untitled - PadNotePro";

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

您不应该调用Form1上的静态属性。相反,请使用instance属性访问标题:

this.Text = "Untitled - PadNotePro";

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

我自己已经解决了问题。您不能在
消息框的代码中运行
表单的代码。您必须使用
后台工作人员
。以下是我使用的代码供参考:

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();
    }
}

我自己已经解决了我的问题。您不能在
消息框的代码中运行
表单的代码。您必须使用
后台工作人员
。以下是我使用的代码供参考:

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();
    }
}


“它不会运行那一行代码”
这到底是什么意思?我觉得它好像跳过了那一行代码,它不会改变
表单的格式Text@Dozer789你的代码里有这么两行,你能指出确切的那一行吗?哎呀,搞砸了。我会修好的。谢谢你指出这一点!只需注释掉消息框调用,在下面使用
对话框result的
if
中,只需输入
if(1=1)
。一些伪值,强制保存代码在没有messagebox的情况下运行。但我开始认为,在其他地方有代码在运行,并将更改收回。你是否对每个方法都做了一个步骤来查看它到底做了什么?
“它不会运行那一行代码”
这到底是什么意思?我觉得它好像在跳过那一行代码,它不会改变
表单的属性Text@Dozer789你的代码里有这么两行,你能指出确切的那一行吗?哎呀,搞砸了。我会修好的。谢谢你指出这一点!只需注释掉消息框调用,在下面使用
对话框result的
if
中,只需输入
if(1=1)
。一些伪值,强制保存代码在没有messagebox的情况下运行。但我开始认为,在其他地方有代码在运行,并将更改收回。您是否对每个方法都做了一个步骤来了解它的具体功能?这是我见过的最好的答案吗?为什么要将
文本
属性包装到另一个属性
FrmValue
<代码>文本
已经公开了,这对我来说毫无意义。@Gigo,你说得对。我想得太多了:)。我已经编辑了我的答案。@Dozer789,你能给我一些关于为什么它不起作用的详细信息吗?这是我见过的最好的答案吗?为什么要将
文本
属性包装到另一个属性
FrmValue
<代码>文本
已经公开了,这对我来说毫无意义。@Gigo,你说得对。我想得太多了:)。我已经编辑了我的答案。@Dozer789,你能告诉我为什么它不起作用的一些细节吗?不,这并没有解决问题。你试图更改表单标题的表单上有这个片段吗?还请检查是否有其他代码意外运行并将其更改回原来的位置。我正试图更改的是
表单
标题。不,这没有解决问题。您正在尝试更改其标题的表单上是否有该代码片段?还要检查是否有其他代码意外运行并将其更改回原来的位置。我正试图更改的是
表单
标题。这将使三个左转向右。它创建后台线程的唯一目的是将回调编组到调用线程。这一功能相当于不使用BW,直接设置this.Text。此外,代码在
消息框中运行也不正确。另一方面,
BackroundWorker
的一个关键特性是,它为您提供了两种方法(
RunWorkerCompleted
ReportProgress
)来为您执行回UI线程的编组,这样您就不必从DoWork方法中调用
了。这需要向左转三圈才能向右转。它创建后台线程的唯一目的是将回调编组到调用线程。这一功能相当于不使用BW,直接设置this.Text。此外,代码在
消息框中运行也不正确。另一方面,
BackroundWorker
的一个关键特性是它为您提供