2013-08-16 112 views
1

我正在做一个记事本程序,我有一个问题;在我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指未保存的,那就是看它是否被保存,如果我们= 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当时没有被激活有关。

+0

'“它不会运行那行代码”'那是什么意思? – Jonesopolis

+0

我好像跳过了那行代码,它不会改变'Form'的文本 – Dozer789

+2

@ Dozer789在你的代码中有这样的两行,所以你能指出确切的一行吗? –

回答

1

我已经想出了我自己的问题。您无法在MessageBox的代码中为您的Form运行代码。您必须使用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(); 
    } 
} 
+0

这使左转三个右转。它创建一个后台线程,仅用于将调用__back__编组到调用线程上。这是相当于不使用BW并直接设置'this.Text'的功能。另外,代码在'MessageBox'中运行是不正确的。作为一个方面,BackroundWorker的一个关键特性是它为您提供了两种方法('RunWorkerCompleted'和'ReportProgress')来进行编组回到UI线程,因此您不必'调用'从DoWork方法。 –

0

字段/属性“ActiveForm”返回什么?除非您多给我们一些关于问题是什么/您遇到什么错误的信息,否则我们将无法回答您的问题。

编辑:

使用此方法来更改窗体的文本:

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

是我见过的最好的答案? –

+1

使用'this.Text'不起作用 – Dozer789

+0

@ Dozer789,请参阅我的上次编辑 – Rohan

0

你不应该叫Form1中的静态属性。相反,使用实例属性来访问标题:

this.Text = "Untitled - PadNotePro"; 

看起来,“活动窗体”成为MessageBox而不是窗体本身。另外,对当前对象使用实例方法通常是一种很好的OOP练习,而不是通过静态属性到达相同的位置。

+0

不,没有解决它 – Dozer789

+0

是您试图更改其标题的表单上的片段​​?请检查是否没有其他代码意外运行并将其更改回 – Alejandro

+0

这是我正在尝试更改的“表单”标题。 – Dozer789