2011-02-04 5 views
1

텍스트 상자에 포커스가있을 때 입력 키를 누르면 양식에서 Enter 키를 누를 때 이상한 동작이 나타납니다.MDI .NET 양식 다른 양식으로 보내지는 키 이벤트 입력

기본적으로 부모 폼은 입력 키가 눌려진 TextBox가있는 폼으로 보내기 대신 기본적으로 다른 자식 MDI 폼으로 키를 보냅니다.

디버그하려면 KeyPreview를 모든 양식 (상위 및 하위 2 개)에서 true로 설정하고 네 개의 주요 이벤트 (미리보기, 위, 아래, 누르기)를 듣기 시작했습니다. 정상적인 키를 누르고 문제가있는 텍스트 상자에 입력 한 경우

C1 < - TextBox가있는 MDI 하위. C2 < - 기타 MDI 자식; P < - 다른 키를 누르면 MDI 부모

: -> P.KeyDown -> C1.KeyPress -> P.KeyPress -> C1.KeyUp - C1.KeyDown 결과> P.KeyUp , 텍스트는 C1의 TextBox에 나타납니다.

누를 때 입력하면 : C22.KeyUp -> P.KeyUp 결과적으로 C2는 초점이 맞춰집니다.

왜?!?!?!?!?! : P

절망적 인 시도로, 모든 양식에서 ProcessCmdKey를 무시하고 어떤 일이 일어나는지 발견하지만 Enter 키를 눌러도 거기서지나 가지 않습니다.

이 중요한 경우 나도 몰라,하지만 내가 (C1 전에 만든 됨) C2의 형태와 C1을 실체화하는 코드를 실체화하는 데 사용되는 코드입니다 ...

참고 : C1 양식


C2 ... 통해 인스턴스 및 C2 형태로 소성 커스텀 이벤트에 대한 응답으로 부모 형태로 나타낸다 :

private void CalendarForm_Load(object sender, EventArgs e) 
    { 
     // Loop through all of the form's controls looking 
     // for the control of type MdiClient. 
     foreach (Control ctl in this.Controls) 
     { 
      if (ctl is MdiClient) 
      { 
       // Set the BackColor of the MdiClient control. 
       ((MdiClient)ctl).BackColor = this.BackColor; 
      } 
     } 

     // Shows the background form 
     this._calendarContents.MdiParent = this; 
     this._calendarContents.Show(); 
     //this._calendarContents.Dock = DockStyle.Fill; 
    } 

C1 :

,
private FloatingEventDetails _floatingEvent = null; 
    private void _calendarContents_ElementDoubleClicked(object sender, ElementDoubleClickedEventArgs e) 
    { 
     // Checks if the form is not open 
     if (this._floatingEvent == null) 
     { 
      // Opens the form 
      this._floatingEvent = new FloatingEventDetails(); 
      this._floatingEvent.ModuleForm = this; 
      this._floatingEvent.ListOfImages = this.ElementTypeImageList; 
      this._floatingEvent.MdiParent = this; 

      // Begins to listen for Focus and LostFocus events 
      this._floatingEvent.GotFocus += new EventHandler(_floatingEvent_GotFocus); 
      this._floatingEvent.LostFocus += new EventHandler(_floatingEvent_LostFocus); 
     } 
     // Displays the form 
     this._floatingEvent.Show(); 
     this._floatingEvent.BringToFront(); 
     this._floatingEvent.Focus(); 

     // Loads the Event in the details form 
     this._floatingEvent.EventId = e.EventId; 
    } 
+0

은 텍스트 상자 multiline ... –

+0

두 개 이상의 TextBoxes (둘 중 하나는 MultiLine)가 있으며 모두 동일한 문제를 나타냅니다. 나는 정말로 Enter 키 이벤트를 캡처하고 싶다 ... – Scudelari

+0

게다가, 문제는 키가 다른 폼의 keypreview에서 제공된다는 것입니다 ... – Scudelari

답변

0

이 문제는 실제로 발생합니다. 양식은 다른 응용 프로그램 도메인에로드되고 데이터베이스에 대한 비동기 연결을 수행하고 양식의 여러 항목을 처리하는 사용자 지정 DLL을 사용하기 때문에 응용 프로그램은 실제로 복잡합니다.

두 번째 형식은 MDI 형식 위에 떠 있어야하는 일종의 "대화 상자"였습니다. 그러나 이제는이 "Dialog Form"이 더 이상 MDI를 사용하지 않도록 설정되어 완전히 분리 된 형식이되었습니다. 이 방법은 작동합니다 ....

+0

이 문제에 대한 해결책을 아직 찾고 있다면 분명하지 않습니다. 해결 방법에 만족한다면 코드를 디버그하고 동작을 설명하는 데 신경 쓰지 않아도됩니다. 한스 (Hans)와 같은 재 프로 젝트를 게시하는 것은 관심이 있다면 매우 도움이 될 것입니다. 당연히 repro 프로젝트는 현재 프로젝트에서 사용중인 기본 폼 클래스를 포함해야합니다. 하지만 내 의문은 대화 상자를 원한다면 어쨌든 폼을 보여주기 위해'ShowDialog' 메서드를 사용해야한다는 것입니다. –

관련 문제