2013-08-19 1 views
2

그래서 stackoverflow 및 다른 인터넷 포럼과 지식 기반에서 유사한 항목을 검색해 왔지만 지금까지는이 문제를 해결하기 위해 노력하지 않았습니다. 1 주일 동안 고투하고있다. 여기에 코드입니다 : 내가 꺼내 경우양식의 MdiParent 속성을 설정하면 중단 된 이벤트가 표시되지 않습니다.

private void matrículasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form1 form1 = new Form1(); 
     form1.Show(); 
     form1.MdiParent = this; // this == the main form of the aplication, wich has IsMdiParent property set to true. 
    } 

은 "form1.MdiParent =이"Form1의 표시 이벤트 핸들러의 모든 콘텐츠를 실행, 일반적으로 발광합니다,하지만 난 거기 허락한다면, 이벤트 표시를 form1의 화재는 발생하지 않을 것입니다 (나는 breakpoits를 설정했으나 아무 것도 트리거하지 않았습니다). 내가로드 이벤트를 사용하는 대신 표시됨 경우

호기심, 모든 것이 잘 작동하지만 난 경우 두려워 조금 :(뭔가를 끊을로드에 대해 표시 스와핑입니다.

+0

나는 그것을 찾았습니다. 내 대답을 업데이트했습니다. –

답변

4

이 코드

Form1 form1 = new Form1(); 
//Subscribe event here 
form1.MdiParent = this; 
form1.Show(); 
시도

이것은 나를 위해 작동

난 당신의 코드가 작동하지 않는 이유는 답을하면, 내가 돌아올거야 모른다.

편집 : 지금 대답을 얻었습니다.

ISynchronizationInvoke's 회원 (InvokeBeginInvoke)은 다음과 같이 Control 클래스로 구현됩니다.

  1. 창을 만든 스레드의 컨텍스트를 가져옵니다.
  2. PostMessage
  3. WndProc를 처리하여 RegisterWindowMessage에 의해 반환 messageId가와 큐 우리가 ThreadMethodEntry에 매개 변수로 전달 된 대리자를 캡슐화 RegisterWindowMessage
  4. 을 사용하여 새 창 messageId가 생성의 스레드 제어의 내부 Queue
  5. 게시물 메시지에 추가 수신 대기열은 messageId이고 대기열은 ThreadMethodEntry이며 대기열을 호출합니다.

여기에 무슨 문제가 있습니까?

Form1 form1 = new Form1(); form1.Show(); form1.MdiParent = this;

Form.Show 어떻게 든 OnLoad 메소드 호출 결과, 그 OnShown이 게시 된 WindowMessageDestroy로 차례로 컨트롤을 강제로 form1.MdiParent = this;을 설정 받기 전에 BeginInvoke

if (base.IsHandleCreated) 
{ 
    base.BeginInvoke(new MethodInvoker(this.CallShownEvent));//reflected code 
} 

그래서 그것을 처리 할 것 사용하여 비동기 적으로 호출하고있는 곳입니다 ReCreate 새 핸들.

DestroyHandle 방법은 PeekMessage 기능을 사용하여 얻는하여 게시 된 메시지를 삼킨 다음 Queue의 모든 요소를 ​​열거하고 대리자를 호출하지만 ObjectDisposedException을 던져 그것을 표시없이 완료로 상태를 설정합니다.

Form1 form1 = new Form1(); 
form1.Show(); 
Action del =() => 
{ 
    Console.WriteLine("This will never be called");//our custom delegates too fails to be invoked 
}; 
var res = form1.BeginInvoke(del); 
//after some more code 
form1.EndInvoke(res);//throws `ObjectDisposedException` which was marked previously 
form1.MdiParent = this; 

투구 ObjectDisposedException("Control") 실제로 오해의 소지가 있습니까?

참고 : DoEvents은 모든 보류중인 메시지를 즉시 처리하므로 보다 먼저 form1.MdiParent = this;을 사용하면 쉽게 해결할 수 있습니다.

+0

OMG, 정말 고마워요!, 일주일 동안이 문제로 고생하고 있다고 생각하지 않습니다. 해결책은 간단합니다. O – user1126775

+0

오 남자, 1 주일입니다. 거대한 시간. 그러나 지금 당신이 그것을 가지고 환호합니다. 내가 찾으면 왜 작동하지 않는지 알려줄거야. 왜 그것이 작동하지 않는지 알고 매우 궁금합니다. –

관련 문제