2010-12-03 13 views
0

J'ai un Windows Form (C#) qui génère dynamiquement des copies d'un contrôle utilisateur. Chacun des contrôles utilisateur enfant a une minuterie.Utiliser la valeur d'un contrôle utilisateur dans le formulaire principal (C#)

Je voudrais résumer sur le formulaire principal le temps total passé par tous les contrôles utilisateur (la somme de tous les minuteurs). Quelle serait la meilleure façon de faire cela? Comment faire pour que les contrôles utilisateur "envoient" leurs valeurs de minuterie au formulaire principal?

merci!

+0

Une minuterie ne passe pas de temps et n'a pas de «valeur». Il fait juste un événement avec son événement Tick. –

+0

Mon mauvais, je ne l'ai pas précisé - je l'appelle une minuterie, mais c'est juste une valeur DateTime qui est calculée comme la différence entre lorsque vous cliquez sur un Start et un Stop :) – Aidenn

Répondre

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

Notez que si vous essayez de compter combien de temps quelque chose prend pour vous compléter voudrez peut-être un System.Diagnostics.StopWatch plutôt que d'une minuterie.

+0

Il est en fait juste une minuterie que les utilisateurs commencent/arrêtent ... Thx pour la pointe! – Aidenn

+0

Il paye pour connaître votre LINQ. l'essayer avec '.Where()' et '.Aggregate()', mais de cette façon, c'est beaucoup plus propre. – ja72

1

Votre contrôle utilisateur peut exposer une TimeSpent de biens qui seraient résumées par le Windows Form

ajouter l'intérieur de votre contrôle utilisateur un TimeSpent de propriété où vous retournez la valeur du temporisateur

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

Pour calculer le temps passé Vous devez vous rappeler combien de fois votre minuteur a tiré et ensuite multiplier ce nombre pour la propriété d'intervalle de minuterie.

la fonction getTimeSpent() doit faire juste que

+0

Sonne exactement ce que je recherche ... Comment puis je faire ça? – Aidenn

+0

J'ai modifié ma réponse et ajouté quelques suggestions. – Lorenzo

+0

Oops, bien sûr, je n'ai pas pensé à ça ... :(Thx !!! – Aidenn

1

Une autre approche consiste à mettre en œuvre une sorte de modèle d'observateur, en C#, il peut être facilement mis en œuvre à l'aide délégués. Commencez par créer un délégué ayant la signature souhaitée, puis ajoutez un événement de votre type de délégué, puis augmentez l'événement lorsque l'événement de contrôle de votre utilisateur se produit. Chaque fois que vous créez une instance de votre Usercontrol, associez l'événement que vous avez déclaré avec une méthode (l'observateur) sur votre client (correspondant à la signature de votre délégué).

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 */ 
    } 
}