2015-04-23 2 views
1

У меня есть событие «Оставить» для TextEditor, в котором я выполняю проверку того, что запись требуется и отображается сообщение об ошибке. Прежде чем выполнить проверку, я проверяю, удалена ли форма, или нажата кнопка «Отмена». В этом случае я выхожу из события отпуска. Но если пользователь нажимает кнопку X, эти две проверки не фиксируют это, и отображается сообщение об ошибке. Я не хочу, чтобы сообщение об ошибке отображалось, если пользователь нажимает кнопку X. Как я могу это достичь?Как определить, нажал ли пользователь кнопку X в событии «Оставить» в текстовом поле

private void TitleTextEditor_Leave(object sender, EventArgs e) 
{ 
    UltraTextEditor _currentControl = sender as UltraTextEditor; 
    if (this.CancelUButton.Focused || this.Disposing) 
    { 
    return; 
    } 
    if (_currentControl.Text.IsNullOrStringEmpty()) 
    { 
    MessageBox.Show("Title is required."); 
    } 
} 

ответ

0

В FormClosingEventArgs у вас есть CloseReason свойство, вероятно, можно использовать его.

+0

Мне нужна проверка события отпуска текстового редактора. К моменту, когда элемент управления находится в событии FormClosing, слишком поздно. Но спасибо за ваш вклад. – Jasmeet

0

Как узнать, закрыта ли форма управления или нет. Я прослушал событие VisibleChanged для того, чтобы угадать форму, потому что ParentChanged может произойти до того, как элемент управления будет добавлен в форму (например, если она находится в панели). Вы также можете отказаться от подписки на события VisibleChanged после первого.

 //put this at class level 
     bool _parentClosed; 
     //put this in controls constructor 
     //when control first becomes visible 
     this.VisibleChanged += (s1, a1) => 
     { 
      //find parent Form (not the same as Parent) 
      Form form = this.FindForm(); 

      //If we are on a Form 
      if (form != null) 
       //subscribe to it's closing event 
       form.Closing += (s2, a2) => { _parentClosed = true; }; 
      else 
       throw new Exception("How did we become visible without being on a Form?"); 
     }; 
+0

Я не уверен, как это поможет моей проблеме. – Jasmeet

3

Это грубая проблема, если вы хотите подавить сообщение об ошибке проверки, которое вы показываете. Единственный достойный способ опередить его - обнаружить сообщение WM_CLOSE до код Winforms видит его и генерирует событие Validating на элементе управления с фокусом.

Вставьте этот код, чтобы решить вашу проблему:

protected override void WndProc(ref Message m) { 
     // Prevent validation on close: 
     if (m.Msg == 0x10) this.AutoValidate = AutoValidate.Disable; 
     base.WndProc(ref m); 
    } 

ли считают, что вы кричать слишком громко. Компонент ErrorProvider - очень достойный способ отображать ошибки проверки и быть тонким. И ничто не преуспевает, когда форма проверяет себя на закрытии, вам нужно только сделать это:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { 
     e.Cancel = false; 
    } 
+0

Спасибо за ваше решение. Я буду использовать его и сообщить, как получилось. – Jasmeet

+0

Что касается отображения сообщений об ошибках, это было требование пользователя, поэтому мы должны были сделать это таким образом. – Jasmeet

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

  • Нет связанных вопросов^_^