MainForm.Refresh (); не делает то, что я думал, что будет делать - PullRequest
0 голосов
/ 31 мая 2009

У меня есть форма, которая получает имя одной из ее меток из текстового файла. Это прекрасно работает при запуске приложения. Но из другой формы этот текстовый файл изменяется, и я хотел бы, чтобы эта метка изменилась соответственно. Это обновление происходит, когда закрывается форма, которая внесла изменения в текстовые файлы. Я думал, что обновление будет делать то же самое, что и то, что происходит, когда я использую MainForm_Load. Но я думаю, нет. Могу ли я сделать что-то не так или просто неправильно понять, что делает Refresh? Спасибо

Ответы [ 4 ]

2 голосов
/ 31 мая 2009

Все, что делает метод 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.

Вот ссылка на пример (просто выполните поиск в FileSystemWatcher, и вы найдете множество других примеров).

2 голосов
/ 31 мая 2009

Метод Refresh вызывает только метод Invalidate, поэтому он просто вызывает перерисовку элементов управления с их текущими данными.

Поместите код, который получает данные из текстового файла, в отдельный метод, чтобы вы могли вызывать его как из обработчика событий Load, так и из любого кода, который должен вызвать перезагрузку.

1 голос
/ 31 мая 2009

Насколько мне известно, Form.Load вызывается один раз при создании экземпляра формы. Для того, чтобы логика, которая обновляет метку для повторного выполнения, она должна вызываться откуда-то еще, когда метка была обновлена ​​

Одной из возможностей является рефакторинг кода обновления метки в метод, а затем использование FileSystemWatcher для получения события, когда изменяется содержимое файла, и затем выполнение метода обновления в ответ

1 голос
/ 31 мая 2009

Ваш пост немного сбивает с толку, но попробуйте MainForm.Invalidate (true) вместо MainForm.Refresh () ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...