Запретить запуск основной формы

public Form1()
{

InitializeComponent();
Update_current_data();  

}

private void Update_current_data()
{
    try
    {
        //...
        //...
        //...
    }
    catch
    {
        switch(MessageBox.Show("You are not connected to a WiFi or your IP address is invalid. The data processes IS UTTER CRAP.",
            "Connection Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1))
        {
            case DialogResult.Abort:
                this.Close();
                Application.Exit();
                break;
            case DialogResult.Ignore:
                break;
            case DialogResult.Retry:Update_current_data();
                break;
        }

    }
}

Итак, Update_current_data(); вызывается еще до загрузки формы, и я проверяю, подключен ли пользователь к Интернету или нет, только сейчас. Теперь, если пользователь не подключен, генерируется исключение и отображается MessageBox с запросом пользователя на Abort, ignore или Retry. (Форма еще не загружена)

Теперь вот в чем проблема. Если пользователь нажимает на abort, я хочу, чтобы форма никогда не загружалась, а приложение полностью закрывалось. Но я не могу использовать this.Close();, поскольку в Program.cs снова возникает исключение:

'Cannot access a disposed object. Object name: 'Form1'.'

и Application.Exit(); не влияет на него, поскольку форма открывается независимо.

Итак, как я могу предотвратить отображение самой формы здесь. Также я не хочу обрабатывать исключение, созданное this.Close(); в файле `Program.cs.

Почему бы вам не переместить код, который проверяет Интернет, в ваш основной метод (Program.cs) перед запуском основной формы?

Steve 18.05.2018 20:54

@Steve У меня есть оба ваших комментария, но я хочу узнать, как предотвратить открытие формы из самого класса Form. И да, form1 - моя основная форма.

Rishav 18.05.2018 21:18

Тогда этот QA может быть вашим ответом stackoverflow.com/questions/3067901/…

Steve 18.05.2018 21:22

Большое спасибо @Steve. И этот ответ, и ответ Резы работают.

Rishav 18.05.2018 21:24

Однако этот ответ не поможет вам, если вы не хотите закрывать все приложение.

Steve 18.05.2018 21:25

Хотя у меня есть ответ и есть обходной путь, я следую лучшей практике, чтобы включить его в сам Program.cs. Я хочу закрыть все свое приложение. Весь вопрос был в изучении нового пути. Я мог бы просто вызвать функцию обновления в Form_load и пропустить все хлопоты, но я хочу научиться.

Rishav 18.05.2018 21:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

К тому времени, когда вы сделаете свою проверку, будет уже слишком поздно, потому что вы уже находитесь в своей форме. Чтобы это сработало, вам нужно переместить чек в Program.cs до того, как он создаст новую форму Form1 ();

Затем вы можете правильно прервать создание окна до того, как оно действительно произойдет.

Нет, я определенно не в своей форме, когда идет проверка. И исключение создается, потому что я пытался закрыть свою форму еще до ее запуска. Мой вопрос в том, как я могу предотвратить открытие моей формы, это явно означает, что моя форма еще не загружена до тех пор, пока не будет воспроизведен MessageBox, иначе функция Form1_Load() уже была бы вызвана.

Rishav 18.05.2018 21:00
Здесь - это порядок загрузки формы.
Rishav 18.05.2018 21:05

@ Ришав не могли бы вы объяснить? Form1 - это не ваша основная форма? Тот, который запускается Application.Run в вашем файле program.cs? Я (в моем комментарии) и этот ответ говорю вам переместить этот код перед вызовом Application.Run. Если код не работает, нет формы для закрытия, потому что форма не была открыта

Steve 18.05.2018 21:10

@Rishav, вы вызываете функцию Update_current_data из конструктора Form1 (). Итак, вы явно уже находитесь внутри своей формы. Вы должны проверить, откуда вызывается конструктор Form1 (), и поместить проверочный код еще до того, как это произойдет.

Pic Mickael 18.05.2018 21:16

Да, я понял, но я хочу узнать, как предотвратить открытие формы из самого класса Form. И да, form1 - моя основная форма.

Rishav 18.05.2018 21:17

@Rishav, вы не можете сделать это из самой формы. Единственное, что вы можете сделать, - это принудительно закрыть его после проверки. Лучше вообще не открывать форму, если проверка не подтвердит, что это нормально. И что вы можете сделать это только до того, как вызовете конструктор Form1.

Pic Mickael 18.05.2018 21:18

@PicMickael Я нахожусь внутри формы, но форма еще не загружена. docs.microsoft.com/en-us/dotnet/framework/winforms/…

Rishav 18.05.2018 21:20
Ответ принят как подходящий

I want the form to never load and the application shut down completely.

Поскольку вы собираетесь закрыть приложение, вы можете использовать метод Environment.Exit. Он завершает процесс и возвращает код выхода в ОС. Например:

Environment.Exit(1);

Примечание:В общем, лучше проверить критерии, прежде чем пытаться показать форму. Но поскольку вы ищете способ выйти из приложения, вы должны знать, что выход из приложения вполне возможен с помощью события метода Environment.Exit в конструкторе формы. Но если вы хотите просто закрыть форму в конструкторе, вы не можете этого сделать в конструкторе, вам следует подписаться на событие Load формы и закрыть форму там. Чтобы увидеть пример, взгляните на эта почта.

Не могли бы вы объяснить мне, почему Application.exit() не работает?

Rishav 18.05.2018 21:27

Вероятно, по той же причине, по которой не работает Form.Close. Application.Exit на самом деле пытается аккуратно закрыть все формы.

Reza Aghaei 18.05.2018 21:31
Form.Close выдает исключение, но Application.Exit ведет себя так, как будто ничего не произошло ...
Rishav 18.05.2018 21:32
Application.Exit скрывает исключения внутри.
Reza Aghaei 18.05.2018 21:35

Другие вопросы по теме