Почему обработчик события «Проверка» моей кнопки никогда не вызывается? - PullRequest
2 голосов
/ 24 марта 2011

В следующем мини-приложении мне интересно, почему никогда не вызывается обработчик событий BtnOk_Validating.Я ожидал, что нажатие кнопки Ok вызовет обработчик событий.

В реальном диалоге есть еще много элементов управления, каждый из которых имеет проверяющий обработчик события.Мой план состоял в том, чтобы использовать обработчик событий, проверяющий кнопку «ОК», для вызова всех других обработчиков событий, прежде чем разрешить закрытие диалога.

Если это не очевидно, я довольно новичок в разработке форм.

using System.ComponentModel;
using System.Windows.Forms;

namespace ConsoleApp
{
    class Program
    {
        static void Main( string[] args )
        {
            Dialog dialog = new Dialog();

            dialog.ShowDialog();
        }
    }

    public class Dialog : Form
    {
        Button m_BtnOk;
        Button m_BtnCancel;

        public Dialog()
        {
            m_BtnOk = new System.Windows.Forms.Button();
            m_BtnCancel = new System.Windows.Forms.Button();

            m_BtnOk.CausesValidation = true;
            m_BtnOk.DialogResult = DialogResult.OK;
            m_BtnOk.Text = "Ok";
            m_BtnOk.Location = new System.Drawing.Point( 0, 0 );
            m_BtnOk.Size = new System.Drawing.Size( 70, 23 );
            m_BtnOk.Validating += new CancelEventHandler( BtnOk_Validating );

            m_BtnCancel.CausesValidation = false;
            m_BtnCancel.DialogResult = DialogResult.Cancel;
            m_BtnCancel.Text = "Cancel";
            m_BtnCancel.Location = new System.Drawing.Point( 0, 30 );
            m_BtnCancel.Size = new System.Drawing.Size( 70, 23 );

            Controls.Add( this.m_BtnOk );
            Controls.Add( this.m_BtnCancel );
        }

        private void BtnOk_Validating( object sender, CancelEventArgs e )
        {
            System.Diagnostics.Debug.Assert( false ); // we never get here
        }
    }
}

Редактировать: Пожалуйста, смотрите мой ответ Вопрос для более полного примера, который работает (в основном хорошо).

1 Ответ

6 голосов
/ 24 марта 2011

Это потому, что кнопка никогда не потеряет фокус, так как это единственный элемент управления.Если вы добавите TextBox или что-то, что может сфокусироваться на кнопке, вы увидите, что она сработает.

От MSDN

Когда выизменить фокус с помощью клавиатуры (TAB, SHIFT + TAB и т. д.), вызвав методы Select или SelectNextControl или установив для свойства ContainerControl.ActiveControl текущую форму, события фокуса происходят в следующем порядке:

   Enter    
   GotFocus    
   Leave    
   Validating    
   Validated    
   LostFocus    

Когда вы изменяете фокус с помощью мыши или вызываете метод Focus, события фокусировки происходят в следующем порядке:

   Enter    
   GotFocus    
   LostFocus    
   Leave    
   Validating    
   Validated    

Если для свойства CausesValidation установлено значение false, события Validating и Validated подавляются.

Обновление: как упоминает Ганс, вам нужно будет извлечь проверку, которую вы выполняете в каждом из событий Validatingдля всех других элементов управления в отдельных функциях.Затем вы можете создать функцию ValidateAll для проверки всех значений.Если функция возвращает false, вы не закрываете Form.Если он возвращает true, вы звоните this.Close().Так это может выглядеть так:

// pseudo code
textbox1.Validating += ValidateTx1();
textbox2.Validating += ValidateTx2();
btnOk.Click += OkBtnClicked();

private void OkBtnClicked(...)
{
    if(ValidateAll())
    {
       this.Close();
    }
}

private bool ValidateTx1(...)
{
   DoTx1Validation();
}

private bool ValidateTx2(...)
{
   DoTx2Validation();
}

private bool ValidateAll()
{
   bool is_valid = DoTx1Validation();
   return (is_valid && DoTx2Validation());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...