-1

それが良いアイデアかどうかはわかりませんが、これはおそらくより学術的な演習になるので、我慢してください。

X 秒ごとに (Timer を使用して) テキスト ファイルを検索し、この UserControl 内にその情報を表示する UserControl を作成していたとします。このコントロールを MyUserControl と呼びましょう。

基本を再ハッシュするには:

このタイマーをこのコントロールのメンバー変数として使用し、次のようなコードを作成します。

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

そして、次のようなイベント ハンドラー メソッド:

private void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

これで、MyUserControl のパブリック プロパティを経過時間に設定できるようになりました。このコントロールをフォームに配置するだけで、小さなコントロールが自動的に更新されます。きちんとした。

ここに私が興味を持ったものがあります:

配置しようとしているフォームには、既にタイマーがあります。では、なぜ 2 つの競合するタイマーがあるのでしょうか。MyUserControl が必要な場合にのみ内部タイマーを使用する方法があることを望みます (たとえば、まだタイマーを持たない別のフォームに配置するなど)。

ここで MyUserControl timer1_Tick を次のように公開できると思います。

public void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

そして、これらはマルチキャストであるため、次の形式で次のようにします。

this.theFormTimer.Tick += new System.EventHandler(this.theFormTimer_Tick);
this.theFormTimer.Tick += new System.EventHandler(MyUserControlObject.timer1_Tick);

また、MyUserControl のメンバー変数を有効にしないように設定します。

しかし、これを行うためのよりスマートな方法はありますか? MyUserControl のイベント ハンドラー メソッドが既にフォーム タイマーの tick イベントに接続されていることをどうにか判断できますか? または、私が提案しているものとは別のタイプのアプローチを使用しますか?

ありがとう!(これが重複してしまった場合は申し訳ありません。今日の私のgoogle-fuは悪いかもしれません)

4

1 に答える 1

1

これをすべきかすべきでないかについては議論しませんが、質問に答えるために、私は次のようにします:

//add a handler
timer.Tick += timer_tick;

//...

//check if timer_tick is wired to Tick
if (timer.Tick.GetInvocationList().Contains (timer_tick))
{
    //do something
}

私はそれをテストしていませんが、それは私が試してみたいものです.

于 2013-09-05T08:36:12.087 に答える