2010-12-03 5 views
0

사용자 정의 컨트롤의 복사본을 동적으로 생성하는 Windows Form (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를 추가 사용자 정의 컨트롤 내부에서 윈도우 폼

로 요약 될 수 속성 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 */ 
    } 
} 
관련 문제