В C # каков наилучший способ закрыть вновь открытую форму, если произошел сбой в событии CTOR / Load? - PullRequest
4 голосов
/ 11 июля 2009

Каков наилучший метод [шаблон] для закрытия вновь открытой формы Windows в C # /. NET, если в событии CTOR / _Load есть обнаруживаемая ошибка?

т.е.,

bool loadError;
MyForm_Load(...) {
  try {
  } catch (SomeException ex) {
    // Alert the user
    MessageBox.Show("There was a critical error.  The form will close.  Please try again.");

    // There was some sort of error, and I just want the form to close now.
    loadError = true;

    return;
  }
}

Теперь я хочу действовать на loadError. Я устал использовать событие Активировать, но это не дало никаких результатов. Любые предложения о том, что лучший способ сделать это?

Обновление: Возможно, мне следовало быть немного более откровенным. Делаем "this.Close ();" во время форм событие Load будет вызывать исключение, поскольку форма не может быть закрыта, а исключение будет «Не удается вызвать Close () при выполнении CreateHandle ()».

Ответы [ 3 ]

3 голосов
/ 11 июля 2009

Как я уже упоминал в комментариях, я попытался на примере примера и вызвал this.Closed () внутри блока catch. Работало просто отлично. Приложение показывало окно сообщения и не показывало мне форму. Я использую .NET3.5 SP1, хотя.

Предположим, что эта ошибка возникает в более ранней версии .NET Framework. Можете ли вы попытаться выяснить, подходит ли вам что-либо из следующего или нет? Похоже, они снова работают на моей машине, но не могут гарантировать, что они будут работать на вашей.

  1. Поместите this.Close () в блок finally, чтобы увидеть, как оно работает

    finally { if (this.loadError) this.Close(); }

  2. Отложите Form.Close () после завершения обработчика события Form.OnLoad.

См. Пример ниже: он не содержит анонимного делегата или лямбда-выражения для более старых версий .NET FW. Пожалуйста, прости меня за частичный урок:)

using System;
using System.Windows.Forms;

namespace ClosingFormWithException
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public delegate void InvokeDelegate();


        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                MyTroublesomeClass myClass = new MyTroublesomeClass();
            }
            catch (ApplicationException ex)
            {

                MessageBox.Show("There was a critical error.  The form will close.  Please try again.");

                this.BeginInvoke(new InvokeDelegate(CloseTheForm));
            }

        }
        private void CloseTheForm()
        {
            this.Close();
        }
    }

    class MyTroublesomeClass
    {
        public MyTroublesomeClass()
        {
            throw new ApplicationException();
        }
    }
}
  1. Используйте комбинацию 1 и 2, если 2 не работает:

    finally { if (this.loadError) this.BeginInvoke(new InvokeDelegate(CloseTheForm)); }

2 голосов
/ 11 июля 2009

Вы пытались вызвать this.Close () в событии FormShown? Это событие вызывается один раз, когда ваша форма отображается впервые. Вы можете проверить состояние ошибки и тут же позвонить.

0 голосов
/ 11 июля 2009

Я думаю, вы должны позвонить form.Dispose() и затем установить form = null. Это должно охватывать основной сценарий использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...