2011-08-31 3 views
2

나는 WinForm 안에 UserControl을 사용하여 데이터를 표시하고 있습니다. 또한 명령 패턴을 사용하여 UserControl이 (약한) 이벤트를 등록하고 명령이 트리거 될 때 처리합니다.UserControl을 더 이상 사용하지 않는 방법 (Close 이벤트 없음)

WinForm에서 Close 이벤트의 이벤트를 등록 취소 할 수 있습니다. 그러나 UserControl에는 그러한 이벤트가 없습니다. UserControl이 더 이상 디스플레이 스택에 없지만 아무 것도 찾을 수 없을 때 해고 될 것으로 생각되는 이벤트를 연결했습니다. Parent이 null이고 대부분의 경우 작동하는지 확인합니다.

는 지금은 Parent 속성은 부모가 더 이상 표시 될 때 더 이상 자식 컨트롤에 대해 null도하지 않을 것입니다 아이 다른 UserControlUserControl (A TabControl 내부 UserControl을 넣어)과을 가지고 싶습니다.

UserControl이 사용되는지 알 수있는 방법이 있습니까?

지금까지 시도한 내용 : Dispose()은 시스템에서 즉시 호출되지 않으므로 유용하지 않습니다. IsVisible은 시스템에 의해 업데이트되지 않습니다. Close 또는 Unload 이벤트가 발생하지 않습니다.

건배.

답변

1

정말 Dispose() 메소드입니다. 만약 일찍 호출되지 않는다면 컨트롤을 사용하는 코드에 버그가 있습니다. Controls.Clear() 또는 Controls.Remove() 사용 예를 들어.

컨트롤의 부모는 항상 Controls 컬렉션을 반복하고 삭제 될 때 자식 컨트롤을 삭제합니다. 폼을 닫을 때 실행되는 폼의 Dispose()에서 시작하여 자동 처리를 취소합니다. 그러나 자신을 컨트롤을 제거 할 때 이 아니라이 자동으로 아닙니다.

+0

나는 UserControl을 직접 추가하거나 제거하고있다. Disposed 이벤트가없고 Dispose 메서드가 이미 디자이너 코드에서 재정의되어 있으므로 여기에 내 코드를 추가 할 필요가 없습니다. – R4cOON

+4

Designer.cs 파일의 Dispose 메서드 재정의를 잘라내어 코드 파일에 붙여 넣습니다. 디자이너 파일의 몇 가지 유효한 편집 중 하나 인 "Component Designer generated code"라고 표시된 영역 앞에 * 있습니다. –

+0

주 클래스 파일에 Dispose() 메서드를 넣을 수 있다는 것을 몰랐습니다. 그때 가야 올바른 길처럼 보입니다. 그것은 탭에있는 2 개의 컨트롤로 내 문제를 해결하지 못하고 현재 컨트롤이 활성화되어 있는지 확인하지만 내가 직접 작성해야한다고 생각합니다. – R4cOON

3

Control에서 사용할 수있는 HandleDestroyed 이벤트가 있습니다.

+0

그래, 조심해. [이 질문] (http://stackoverflow.com/questions/8657862/handledestroyed-event-in-usercontrol)을 참조하십시오. – pelesl

0

이전에는 부모 폼 (Control.ParentForm 사용)을 가져 와서 FormClosing 이벤트에 직접 연결하여이 문제를 처리했습니다.

까다로운 부분은 ParentForm을 호출 할시기를 아는 것입니다. 사용자 정의 컨트롤을 처음 만들 때 설정되지 않습니다. 때로는 OnLayout 처리기를 재정 의하여 ParentForm이 null이 아닐 때까지 모니터링합니다.

관련 문제