2010-12-03 8 views
0

ユーザーコントロールのコピーを動的に生成するWindowsフォーム(C#)があります。子のユーザーコントロールのそれぞれにタイマーがあります。ユーザーコントロールの値をメインフォームに使用する(C#)

私はすべてのユーザーコントロール(すべてのタイマーの合計)が費やした全体的な時間をメインフォームで要約したいと思います。これを行う最善の方法は何でしょうか?ユーザーコントロールがタイマー値をメインフォームに「送信」させるにはどうすればよいですか?

ありがとうございました!

+0

タイマーは時間を費やさず、「価値」を持っていません。 Tickイベントでイベントを実行させるだけです。 –

+0

私は悪い、私はそれを明確にしていない - 私はそれをタイマーと呼びますが、それはあなたが開始と停止をクリックするときの違いとして計算されたDateTime値です: – Aidenn

答えて

3
MyForm.Controls.OfType<MyCustomControlType>().Sum(c => c.TimeTakenProperty) 

注意を行う必要があります。

+0

実際には、ユーザーが開始/停止するタイマーです...ヒントのThx! – Aidenn

+0

あなたのLINQを知ってお金を払っています。 '.Where()'と '.Aggregate()'を使って試してみましょう。 – ja72

1

あなたはタイマー値を返すプロパティTimeSpentを追加するには、ユーザーコントロール内のWindowsフォーム

で要約されるだろう財産TimeSpentを公開することができますあなたのユーザーコントロール費やした時間を計算する

public long TimeSpent 
{ 
    get { return getTimeSpent(); } 
} 

あなたのタイマーが何回発砲されたのかを覚えておき、タイマーインターバルのプロパティーにその数を掛ける必要があります。

getTimeSpent()機能を使用すると、完了するまでに取っているどのくらい何かカウントしようとしている場合は、タイマーではなくSystem.Diagnostics.StopWatchを望むことがまさにそれ

+0

私が探しているものとまったく同じです... どうやってやるの? – Aidenn

+0

私は私の答えを編集し、いくつかの提案を追加しました。 – Lorenzo

+0

おっと、確かに、私はそれについて考えなかった... :(Thx !!! – Aidenn

1

別のアプローチは、それが容易デリゲートを用いて実現することができるC#で、オブザーバーパターンのいくつかの種類を実装することです。最初に必要な署名を持つデリゲートを作成してから、デリゲート型のイベントをインクルードし、ユーザーのコントロールイベントが発生したときにイベントを発生させます。 UserControlのインスタンスを作成するたびに、クライアント上の何らかのメソッド(オブザーバ)で宣言したイベント(デリゲートの署名と一致するイベント)が関連付けられます。

public delegate void MyUserControlEvent(UserControl control, object sender, EventArgs e); 

public partial class MyUserControl : UserControl 
{ 
    public event MyUserControlEvent TheEvent; 

    private void TimerFecha_Tick(object sender, EventArgs e) 
    { 
     if (TheEvent != null) { TheEvent(this, sender, e); } 
    } 
} 

public partial class SomeClient : SomeBase 
{ 
    public SomeClient() 
    {  
     MyUserControl control = new MyUserControl(); 
     control.TheEvent = TheListenerProcedure; 
    } 

    public void TheListenerProcedure(UserControl control, object sender, EventArgs e) 
    { 
     /* IMPLEMENT LOGIC HERE */ 
    } 
} 
関連する問題