MainForm.Refresh();不做我认为会做的事情

时间:2009-05-31 14:45:46

标签: c# winforms

我有一个Form,它从文本文件中获取其中一个标签的名称。这在启动应用程序时工作正常。但是从另一个Form文本文件更改,我希望Label相应地更改。当发生这些文本文件更改的表单关闭时,将进行此刷新。我认为刷新它会和我使用MainForm_Load时发生的事情做同样的事情。但我猜不是。我可能做错了什么或只是误解了Refresh的作用? 感谢

4 个答案:

答案 0 :(得分:2)

Refresh方法仅调用Invalidate方法,因此只会使控件重新显示其当前数据。

将从文本文件中获取数据的代码放在一个单独的方法中,以便您可以从Load事件处理程序以及需要重新加载的任何代码中调用它。

答案 1 :(得分:2)

表单上的所有Refresh方法都是使表单无效然后调用Update(归结为UpdateWindow调用)

解决问题的一种方法是使用FileSystemWatcher对象监视文本文件以进行更改。检测到更改后,它可以调用打开文件的代码并将数据输出到标签。

FileSystemWatcher fsw = new FileSystemWatcher();
fsw.Path = @"c:\temp";  // path to file
fsw.Filter = "yourfile.txt";
fsw.Changed += fsw_Changed;
fsw.EnableRaisingEvents = true;

然后在您更改的事件中,您刚刚定义了

void fsw_Changed(object sender, FileSystemEventArgs e)
{
  updateLabelFromTextFile();
}

private void updateLabelFromTextFile()
{
  var fs = File.OpenText(@"c:\temp\yourfile.txt");
  string sContent = fs.ReadToEnd();
  fs.Close();
  fs.Dispose();

  if (label1.InvokeRequired)
  {
    MethodInvoker mi = delegate { label1.Text = sContent; };
    this.BeginInvoke(mi);
  }
  else
    label1.Text = sContent;
}

请注意,FileSystemWatcher事件是在单独的线程中触发的,因此需要BeginInvoke。

以下是example的链接(只需在FileSystemWatcher上进行搜索,您就会找到更多示例)。

答案 2 :(得分:1)

您的帖子有点令人困惑,但请尝试使用MainForm.Invalidate(true)而不是MainForm.Refresh()......

答案 3 :(得分:1)

据我所知,Form.Load会在创建表单实例时引发一次。为了更新标签的逻辑重新执行,必须在标签更新后从其他地方调用

一种可能性是将标签更新代码重构为方法,然后使用FileSystemWatcher在文件内容发生更改时接收事件,然后执行响应中的更新方法