form.dispose () всегда вызывает событие Validating и показывает всплывающее сообщение - PullRequest
1 голос
/ 27 октября 2011

когда я вызываю form.dispose(), форма всегда вызывает событие Validating и показывает сообщение MessageBox. Как я могу предотвратить, когда form.dispose() выполняет, что событие Validating не сработает. У меня есть MessageBox.Show() сообщения в событии Validating, поэтому они всегда находятся сверху при выполнении form.Dispose().

Можно ли вообще это предотвратить на выходе? Я использую компактный каркас 3,5

Код:

public static void Close<T>(string formName) where T : Form
{
    Form f = null;
    if (Dict.TryGetValue(formName, out f))
    {
        Dict.Remove(formName);
        f.Dispose();
    }
}

и валидация события

private void acPredmetObravnave_Validating(object sender, CancelEventArgs e)
{
   if (....)
   {
       MessageBox.Show("Error");
   }
}

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Простое решение:

public class MyForm: Form
{
    public InternalClose = false;

    // Your code...


    private void acPredmetObravnave_Validating(object sender, CancelEventArgs e)
    {
        if (InternalClose ) return;
        if (....) MessageBox.Show("Error");
    }
}

А потом

public static void Close<T>(string formName) where T : MyForm
{
    MyForm f = null;
    if (Dict.TryGetValue(formName, out f))
    {
        Dict.Remove(formName);
        f.InternalClose = true;
        f.Close();
        f.Dispose();
    }
}
2 голосов
/ 27 октября 2011

Есть ли причина, по которой вы явно вызываете Dispose () в форме?

Вы не должны вызывать Dispose () до закрытия формы. Это дает вам возможность обработать любую необходимую проверку событий OnClosing или OnClosed и отключить дальнейшую проверку и окна сообщений.

Замечания по поводу вашего кода:

  • Почему метод Close является универсальным?
  • Вы не должны хранить ссылки на формы в статическом словаре. Вы можете вызвать утечку памяти.
  • Перед вызовом Dispose () отключите проверку. Попробуйте сделать это, используя свойство CausesValidation в false.
  • Либо внутри форм обрабатывает событие OnClosing и предотвращает дальнейшую проверку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...