L'errore è dovuto al fatto che il tuo metodo OnChanged è stato definito static e quindi non puoi accedere agli oggetti della form.
Se lo hai definito static perchè ti dava errore quando nel metodo run agganciavi l'evento considera che anche in questo caso il problema è lo stesso. Il metodo Run è statico e non può accedere a dei metodi non statici.
Quindi ti consiglio di inserire il codice nel FileSystemWatcher in un metodo non statico della form, così puoi agganciare l'evento OnChange senza la keyword static.
Un'altra cosa da prendere in considerazione è che all'interno dell'evento OnChanged non potrai accedere direttamente agli oggetti della form perchè l'evento è gestito in un thread separato. Per ovviare a questo devi sfruttare il metodo Invoke e la proprietà InvokeRequired
http://msdn2.microsoft.com/it-it/library/system.windows.forms.control.invokerequired.aspx
Ti invio comunque una form di test che ho fatto per provare il tuo esempio:
public partial class Form1 : Form
{
public delegate void AddToListDelagate(string str, bool clear);
FileSystemWatcher watcher = null;
public Form1()
{
InitializeComponent();
// Create a new FileSystemWatcher and set its properties.
watcher = new FileSystemWatcher();
watcher.Path = @"D:\";
watcher.Filter = "prova.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Legge il contenuto del file
ReadFileContent();
}
private void ReadFileContent()
{
//Lettura file
StreamReader sr = File.OpenText(@"d:\prova.txt");
string riga = null;
//Pulizia della lista
if (this.InvokeRequired)
this.Invoke(new AddToListDelagate(AddToList), String.Empty, true);
else
AddToList(riga, true);
do
{
//Legge una riga
riga = sr.ReadLine();
if (this.InvokeRequired)
//Utilizza metodo invoke per accedere agli oggetti della form
this.Invoke(new AddToListDelagate(AddToList), riga, false);
else
//Accesso diretto agli oggetti della form
AddToList(riga, false);
}
while (riga != null);
sr.Close();
}
/// <summary>
/// Aggiunge una stringa alla lista
/// </summary>
private void AddToList(string str, bool clear)
{
if (clear)
{
lstbox.Items.Clear();
return;
}
if (String.IsNullOrEmpty(str))
return;
else
lstbox.Items.Add(str);
}
}
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko