将用户控件中的值用于主窗体(C#)

时间:2010-12-03 01:36:38

标签: c# user-controls

我有一个Windows窗体(C#),可以动态生成用户控件的副本。每个子用户控件都有一个计时器。

我想总结主要表格所有用户控件花费的总时间(所有计时器的总和)。最好的方法是什么?如何让用户控件将其计时器值“发送”到主窗体?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

请注意,如果您要计算完成某项内容需要多长时间,则可能需要System.Diagnostics.StopWatch而非Timer。

答案 1 :(得分:1)

您的用户控件可以公开将由Windows窗体

汇总的属性TimeSpent

在用户控件中添加一个属性TimeSpent,返回计时器值

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

要计算花费的时间,您需要记住计时器触发的次数,然后将该数字乘以计时器间隔属性。

getTimeSpent()函数应该只做那个

答案 2 :(得分:1)

另一种方法是实现某种观察者模式,在C#中,可以使用 delegates 轻松实现。首先创建一个具有所需签名的委托,然后包含委托类型的事件,然后在用户的控制事件发生时引发事件。每次创建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 */
    }   
}