2009-05-31 6 views
0

J'ai un formulaire qui obtient le nom de l'un de ses étiquettes à partir d'un fichier texte. Cela fonctionne très bien au démarrage de l'application. Mais à partir d'un autre formulaire, ce fichier texte change et je voudrais que Label change en conséquence. Cette actualisation a lieu lorsque le formulaire qui a fait ces modifications de fichiers texte s'est fermé. Je pensais que Rafraîchir ferait la même chose que ce qui se passe quand j'utilise MainForm_Load. Mais je suppose que non. Pourrais-je faire quelque chose de mal ou simplement me méprendre sur ce que Refresh fait? MerciMainForm.Refresh(); ne fait pas ce que je pensais qu'il ferait

+0

Pendant quel événement remplissez-vous les étiquettes du fichier texte? –

+0

A l'origine, il obtient le texte pendant le MainForm_Load – JimDel

Répondre

2

La méthode Refresh appelle uniquement la méthode Invalidate, il provoque juste repeindre des contrôles avec leurs données actuelles.

Placez le code qui extrait les données du fichier texte dans une méthode distincte, de sorte que vous puissiez l'appeler à la fois depuis le gestionnaire d'événements Load et depuis n'importe quel code qui doit provoquer le rechargement. Pour autant que je sache, Form.Load est levé une fois lors de la création d'une instance du formulaire.

+0

C'était ce dont j'avais besoin Guffa! Merci. – JimDel

1

Votre message est un peu confus, mais essayez MainForm.Invalidate (true) au lieu de MainForm.Refresh() ...

+0

Merci, mais cela n'a pas fonctionné pour moi non plus. J'ai édité ma question. J'espère que je l'ai fait plus clair. – JimDel

+0

Cela ne fera aucune différence, car c'est exactement ce que fait la méthode Refresh. – Guffa

1

Pour que la logique qui met à jour l'étiquette soit réexécutée, elle doit être appelée ailleurs à chaque fois que l'étiquette a été mise à jour

Une possibilité consiste à refactoriser le code de mise à jour d'étiquette en une méthode, puis à utiliser un FileSystemWatcher pour recevoir un événement lorsque le contenu des modifications du fichier, puis exécutez la méthode de mise à jour en réponse

2

Toute la méthode Refresh sur un formulaire n'est Invalider la forme appelle ensuite mise à jour (qui se résume à un appel UpdateWindow)

One façon de résoudre votre problème consiste à utiliser l'objet FileSystemWatcher pour surveiller votre fichier texte pour les modifications. Lorsqu'un changement est détecté, il peut alors appeler votre code qui ouvre le fichier et envoie les données à votre étiquette.

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

Ensuite, dans votre événement a changé que vous venez de définir

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; 
} 

Notez que les événements FileSystemWatcher sont tirés dans un thread séparé, donc la nécessité de BeginInvoke.

Voici un lien vers un example (faites simplement une recherche sur FileSystemWatcher et vous trouverez des tonnes d'autres exemples).

+0

Wow! J'aime ce site! Jamais entendu parler de FSW. Merci de m'apprendre quelque chose de nouveau. Un exemple de code ET un lien vers un autre. Impressionnant. Merci encore Harpua. – JimDel

+0

FSW est une bonne chose. Il y a des trucs que vous devez faire attention et travailler, mais une bonne chose à avoir dans votre boîte à outils. – Harpua

Questions connexes