2010-08-22 5 views
0

코드에서 개체를 삭제하고 다시 작성하고 싶습니다.오브젝트를 삭제 한 후에 어떻게 생성합니까?

어떻게하면됩니까?

대답은 다음과 같습니다

private void showToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     xpPanelGroup1.CreateControl(); 
     xpPanelGroup1.Visible = true; 
     ... 


    } 
    private void noShowToolStripMenuItem_Click(object sender, EventArgs e) 
      { 
       xpPanelGroup1.Visible = false; 
        ... 
       xpPanelGroup1.Dispose(); 
      } 
+0

코드를 추가 할 수 있습니까? –

+0

아니요 아니요 아니요 아니요 아니요 아니요 - CreateControl()을 호출하면 기본 Windows 핸들을 다시 만들 수 있지만 실제 컨트롤 자체는 여전히 삭제되었습니다. 결국 양식을 닫을 때 새 컨트롤 핸들이 정리되지 않습니다. 나중에 프로젝트의 디버깅 통증을 경험할 정확한 방향으로 나아가고 있습니다. 응용 프로그램이 사용자 시스템에 불안정성을 가져올 수 있습니다. – Bevan

+0

안녕하세요, 제 통제를 처분해야합니다. 그래서, 모든 대답을 사용합니다 .Visible = true는 나를 위해 일하지 않습니다! 확인 하시겠습니까? 그래서 내 질문 X에 부정 투표를 부탁하지 마십시오. < –

답변

5

Dispose()을 호출 한 후에 새 개체를 만들어야합니다.

그러나 개체를 나중에 다시 사용하려는 경우에는 처리하지 말아야합니다. 일시적으로 컨트롤을 숨기려면 Hide 또는 .Visible = false 또는 유사한 문자를 사용하십시오.

편집 : 코드에서 당신은 새로운 xpPanelGroup1 만들 :

UIComponents.XPPanelGroup xpPanelGroup1 = new UIComponents.XPPanelGroup() ; 

을하지만 그건 showToolStripMenuItem_Click 방법 로컬 전용입니다.

xpPanelGroup1 = new UIComponents.XPPanelGroup() ; 

과 같이 입력하면 noShow 메서드에서 처리 할 때와 동일한 변수가 사용됩니다.
하지만 여전히 처분하는 대신 숨기기 만하는 것이 좋습니다.

+0

Hide() 또는 Visible = false 또는 유사한 것을 사용하면 +1됩니다. 왜? 모든 WinForms 컨트롤에서 Dispose()를 호출하기 전에 폼에서 컨트롤을 적절하게 제거해야합니다. 즉, 관련 컨트롤 목록에서 꺼내고 이벤트를 푸는 등의 작업을 수행 할 수 있습니다.하지만 제대로 작동하려면 꽤 복잡합니다. , 매우 불쾌한 메모리 누수로 끝내기가 매우 쉽습니다. – Bevan

+0

다른 방법을 말해주십시오 ... 나는 처분한다 : | –

+0

코드에서 오류가있는 내 대답을 편집했습니다. –

0

당신은 (자동 디자인 타임에 의해 생성 된 ".designer.cs"파일) 설계 코드의 모양을하고 전화를 시도해야합니다. 이것은 위젯이 인스턴스화 될 때 실행되는 코드입니다.

+1

하지만 WinForms 디자이너가 생성 한 코드는 인스턴스별로 한 번만 * 실행되도록 설계되었습니다. 단일 인스턴스에 대해 여러 번 실행하면 많은 USER 핸들이 누출됩니다. 그 (프로세스 당 한도는 단지 10k입니다) 밖으로 실행하고 비누 거품처럼, 당신의 프로세스가 완전히 살해됩니다. 아니 닥터 왓슨, 아니 로깅, 아무것도 - 그냥 사라 *. 안좋다. – Bevan

0

아마도 개체를 삭제하는 대신 null로 설정하고 다시 사용할 때 다른 값으로 다시 할당하는 것일 수 있습니다.

+1

문제는 WinForms 컨트롤이 종종 서로 뒤에서 서로 참조를 포착하는 경향이 있다는 것입니다. – Bevan

관련 문제