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.
@Steve У меня есть оба ваших комментария, но я хочу узнать, как предотвратить открытие формы из самого класса Form. И да, form1 - моя основная форма.
Тогда этот QA может быть вашим ответом stackoverflow.com/questions/3067901/…
Большое спасибо @Steve. И этот ответ, и ответ Резы работают.
Однако этот ответ не поможет вам, если вы не хотите закрывать все приложение.
Хотя у меня есть ответ и есть обходной путь, я следую лучшей практике, чтобы включить его в сам Program.cs. Я хочу закрыть все свое приложение. Весь вопрос был в изучении нового пути. Я мог бы просто вызвать функцию обновления в Form_load и пропустить все хлопоты, но я хочу научиться.





К тому времени, когда вы сделаете свою проверку, будет уже слишком поздно, потому что вы уже находитесь в своей форме. Чтобы это сработало, вам нужно переместить чек в Program.cs до того, как он создаст новую форму Form1 ();
Затем вы можете правильно прервать создание окна до того, как оно действительно произойдет.
Нет, я определенно не в своей форме, когда идет проверка. И исключение создается, потому что я пытался закрыть свою форму еще до ее запуска. Мой вопрос в том, как я могу предотвратить открытие моей формы, это явно означает, что моя форма еще не загружена до тех пор, пока не будет воспроизведен MessageBox, иначе функция Form1_Load() уже была бы вызвана.
@ Ришав не могли бы вы объяснить? Form1 - это не ваша основная форма? Тот, который запускается Application.Run в вашем файле program.cs? Я (в моем комментарии) и этот ответ говорю вам переместить этот код перед вызовом Application.Run. Если код не работает, нет формы для закрытия, потому что форма не была открыта
@Rishav, вы вызываете функцию Update_current_data из конструктора Form1 (). Итак, вы явно уже находитесь внутри своей формы. Вы должны проверить, откуда вызывается конструктор Form1 (), и поместить проверочный код еще до того, как это произойдет.
Да, я понял, но я хочу узнать, как предотвратить открытие формы из самого класса Form. И да, form1 - моя основная форма.
@Rishav, вы не можете сделать это из самой формы. Единственное, что вы можете сделать, - это принудительно закрыть его после проверки. Лучше вообще не открывать форму, если проверка не подтвердит, что это нормально. И что вы можете сделать это только до того, как вызовете конструктор Form1.
@PicMickael Я нахожусь внутри формы, но форма еще не загружена. docs.microsoft.com/en-us/dotnet/framework/winforms/…
I want the form to never load and the application shut down completely.
Поскольку вы собираетесь закрыть приложение, вы можете использовать метод Environment.Exit. Он завершает процесс и возвращает код выхода в ОС. Например:
Environment.Exit(1);
Примечание:В общем, лучше проверить критерии, прежде чем пытаться показать форму. Но поскольку вы ищете способ выйти из приложения, вы должны знать, что выход из приложения вполне возможен с помощью события метода Environment.Exit в конструкторе формы. Но если вы хотите просто закрыть форму в конструкторе, вы не можете этого сделать в конструкторе, вам следует подписаться на событие Load формы и закрыть форму там. Чтобы увидеть пример, взгляните на эта почта.
Не могли бы вы объяснить мне, почему Application.exit() не работает?
Вероятно, по той же причине, по которой не работает Form.Close. Application.Exit на самом деле пытается аккуратно закрыть все формы.
Form.Close выдает исключение, но Application.Exit ведет себя так, как будто ничего не произошло ...
Почему бы вам не переместить код, который проверяет Интернет, в ваш основной метод (Program.cs) перед запуском основной формы?