2012-05-07 4 views
4

런타임에 다른 사용자 컨트롤을 추가 할 컨테이너라는 사용자 정의 컨트롤이 있습니다.목록 항목을 null로 설정하는 방법 C#?

컨테이너에서 모든 컨트롤을 제거하고 싶습니다. container.Controls.Clear()을 수행하고 있지만 컨트롤이 메모리에 남아 있습니다. 어떻게하면 null로 만들 수 있습니까?

답변

4

한다고 가정 패널은 당신에게 부모의 모든 자식 컨트롤이 포함 된 제어, 그래서 루프를 각 ... 방법을 처분 부르는 그 문제 해결할 수 있습니다

while (panel.Controls.Count > 0) 
    { 
    panel.Controls[0].Dispose(); 
    } 

clear 메소드를 호출하면 메모리가 아닌 컨테이너 컨트롤에서 컨트롤을 제거 할 수 있으므로 폐기해야합니다.

1

부모 컨테이너에 Dispose()을 호출하면 그 자식 컨트롤은 IDisposable도 구현한다고 가정합니다. 일반적으로 말하자면, 모든 WinForms 컨트롤은 IDisposable을 구현하여 이것이 작동해야합니다.

WPF 컨트롤이 암시 적으로 비 관리 코드를 사용하므로 WPF의 경우와 같이 컨트롤에 사용자 지정 정리 메서드를 추가해야합니다. 메모리 누수의 가장 일반적인 원인 중 하나는 검색되지 않은 이벤트 처리기입니다. 나는 일반적으로 다음과 같은 작업을 수행합니다

public void CleanUp() 
{ 
    //detach event handlers 
    //other cleanup as necessary 
} 

이 가상하고 사용자 컨트롤을 상속 할 기본 클래스에 추가 할 경우이 따라서 당신은 단순히 형식을 확인하지 않고 CleanUp()를 호출 할 수 있습니다, 특히 유용 . IDisposable은 주로 관리되지 않는 리소스를 정리하기 때문에 IDisposable을 구현하는 대신 개인적으로이 메서드를 사용합니다.

관련 문제