私はテキストファイルからそのラベルの1つの名前を取得するフォームを持っています。これは、アプリケーションを起動するときに正常に動作します。しかし、テキストファイルが変更される別のフォームからは、そのラベルを適宜変更したいと思います。この更新は、テキストファイルの変更を行ったフォームが終了したときに行われます。私はMainForm_Loadを使用したときに起こることと同じことをリフレッシュすると思いました。しかし、私はそうは思わない。私は間違ったことをしているか、リフレッシュが何をしていると誤解していますか?代わりにMainForm.Refreshの おかげMainForm.Refresh();私はそれがすると思ったことをしません
答えて
はRefresh
方法は唯一Invalidate
メソッドを呼び出して、それだけで再描画が発生しますコントロールの現在のデータと比較します。
Load
イベントハンドラとリロードの原因となるコードの両方から呼び出すことができるように、テキストファイルのデータを別の方法で取得するコードを記述します。
それは私がGuffaが必要だったものでした!ありがとう。 – JimDel
Formのインスタンスが作成されるとForm.Loadが1回発生します。ラベルを更新しているロジックが再実行されるためには、ラベルが更新されるたびに呼び出さなければならない。
ラベル更新コードをメソッドにリファクタリングし、FileSystemWatcherを使用してその後、ファイルの変更の内容とは、応答
でupdateメソッドを実行するイベント、フォーム上のすべてのRefreshメソッドませんが、フォームが、その後
ワン(UpdateWindowコールに沸く)の更新を呼び出して無効ですあなたの問題を解決する方法は、FileSystemWatcherオブジェクトを使用してテキストファイルの変更を監視することです。変更が検出されると、コードを呼び出してファイルを開き、ラベルにデータを出力します。
FileSystemWatcher fsw = new FileSystemWatcher();
fsw.Path = @"c:\temp"; // path to file
fsw.Filter = "yourfile.txt";
fsw.Changed += fsw_Changed;
fsw.EnableRaisingEvents = true;
は、その後、あなたの変更イベントであなただけのFileSystemWatcherイベントが別のスレッドで焼成されていることを
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;
}
注意、BeginInvokeメソッドのためのための必要性を定義しました。
ここにはexampleへのリンクがあります(FileSystemWatcherで検索するだけで、さらに多くの例が見つかります)。
テキストファイルからラベルを埋めているイベントはありますか? –
元々、MainForm_Loadの間にテキストを取得しました – JimDel