2011-02-04 2 views
1

У меня странное поведение в форме MDI, когда клавиша ввода нажата в одной из форм при сфокусированном текстовом поле.MDI .NET Forms Введите ключевое событие, отправленное в другую форму

В принципе, родительская форма каким-то образом отправляет ключ в другую дочернюю форму MDI вместо отправки ее в форму, где TextBox, в котором была нажата клавиша ввода.

Для отладки я установил KeyPreview в true для каждой формы (родительский и 2 ребенка) и начал прослушивать четыре ключевых события (Preview, Up, Down, Press), и поведение этого отличается от того, нормальный ключ нажат, и если ввод находится в проблемных текстовых блоках.

C1 < - MDI Ребенок с TextBox; C2 < - Другой ребенок MDI; P < - MDI Parent

Если какая-либо другая клавиша нажата: C1.KeyDown -> P.KeyDown -> C1.KeyPress -> P.KeyPress -> C1.KeyUp -> P.KeyUp В результате, текст появляется в текстовом поле C1, где он должен быть.

Если ввод нажат: C2.KeyUp -> P.KeyUp В результате C2 фокусируется.

ПОЧЕМУ?!?!?!?!?!? : P

Как отчаянная попытка, я перепробовал ProcessCmdKey в каждой форме, чтобы узнать, что происходит, но нажатие клавиши ввода даже не проходит мимо.

Я не знаю, если это важно, но это код, который я использовал создать экземпляр формы C2 (который сделан до того С1) и код С1 создания экземпляра ...

Примечание: C1 форма инстанциирован и показаны в родительской форме как ответ на пользовательское событие, запущенной форме C2 ...


С2:

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; 
    } 

С1:

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

- это ваше текстовое поле многострочное ... –

+0

У меня есть несколько текстовых полей (один из них - MultiLine), и все они представляют одну и ту же проблему. Я действительно хочу захватить событие ввода ключа ... – Scudelari

+0

Кроме того, проблема в том, что ключ задан в ключевом представлении другой форме ... – Scudelari

ответ

0

Эта проблема действительно есть. Приложение действительно сложное, так как формы загружаются в другой домен приложения и использует пользовательскую DLL, которая выполняет асинхронные подключения к базе данных и обрабатывает несколько вещей в формах.

Независимо от того, вторая форма была своего рода диалоговым окном, которое я хотел бы плавать над формой MDI. Но теперь эта «Форма диалога» была установлена, чтобы больше не использовать MDI и, таким образом, стала полностью разделенной формой. Таким образом, он работает ....

+0

Мне не совсем понятно, если вы все еще ищете решение этой проблемы. Если вас устраивает обходной путь, я не буду пытаться отлаживать код и объяснять поведение. Публикация репроцентного проекта, такого как упоминания Ханса, была бы очень полезной, если бы вы позаботились. Очевидно, что в проекте воспроизведения должен быть включен любой базовый класс формы, который вы используете в текущем проекте. Но мое подозрение состоит в том, что если вы хотите диалог, вы должны использовать метод ShowDialog для отображения формы в любом случае. –

Смежные вопросы