2009-05-31 3 views
0

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

+0

Во время какого события вы заполняете надписи из текстового файла? –

+0

Первоначально он получает текст во время MainForm_Load – JimDel

ответ

2

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

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

+0

Это было то, что мне нужен был Гуффа! Благодарю. – JimDel

1

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

+0

Спасибо, но это тоже не сработало. Я отредактировал свой вопрос. Надеюсь, я сделал это более ясным. – JimDel

+0

Это не имеет значения, поскольку это именно то, что делает метод Refresh. – Guffa

1

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

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

2

Все метод Refresh на форме делает Аннулируйте форму затем вызывает Update (которая сводится к UpdateWindow вызова)

One способ решить вашу проблему - использовать объект 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, и вы найдете много примеров).

+0

Вау! Мне нравится этот сайт! Никогда даже не слышал о FSW. Спасибо, что научил меня чему-то новому. Пример кода И ссылка на другую. Потрясающие. Еще раз спасибо Harpua. – JimDel

+0

FSW - отличная вещь. Есть некоторые gotcha, вы должны быть осторожны с ним и работать, но очень хорошо иметь в своем инструменте. – Harpua

Смежные вопросы