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