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
的一个关键特性是它为您提供