2010-08-26 2 views
0

У меня есть простое приложение:Как прервать конструктор оконной формы?

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

конструктор Form1:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     // ... 

     if (some_condition) 
     { 
      DialogResult dr = MessageBox.Show("Do you want to continue ?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error); 

      if (dr == DialogResult.No) 
      { 
       // How to close the window normally or how to not create a Form1 instance ? 
       // 
       // 
      } 
     } 

     // amount of code that executes only if some_condtion == false 
    } 
} 

Я знаю, что я могу проверить some_condition до того Application.Run, но это трудно изменить (поверьте). Мне нужно проверить some_condition в конструкторе Form1. Если some_condition == true, а ответ - нет -> приложение закрывается.

+1

Просто поместите эту логику в статический метод формы. Таким образом, вы можете вызвать его до создания формы. –

ответ

1

Цель конструктора - создать экземпляр объекта. Поэтому он не должен терпеть неудачу, если какая-либо предпосылка объекта не выполняется. В этом конкретном случае единственным вариантом является исключение.

Другими словами: вы вызываете конструктор объекта, чтобы создать экземпляр этого объекта, так что это атомная функция и не должна терпеть неудачу, если у вас нет технической проблемы.

Теперь вы должны избегать отображения формы при некоторых условиях. Есть несколько способов сделать это. Во-первых, давайте посмотрим на код:

Application.Run(new Form1()); 

Этот фрагмент кода делает две вещи: создание экземпляра Form1 и его отображения (путем подачи его в Application.Run). Таким образом, один из вариантов:

// snippet at program.cs 
Form1 mainForm = new Form1(); 
if (mainForm.IsValid) 
{ 
    Application.Run(new Form1());   
} 

// snippet at Form1.cs 
public bool IsValid 
{ 
    get 
    { 
     // evaluate all conditions that should determine if the form is to be showed. 
     return condition; 
    } 
} 

Вы должны добавить код в program.cs, чтобы проверить, является ли форма действительной. Один из способов - разоблачить это как свойство в форме. Конечно, если вы следуете separation of concerns, возможно, это будет метод/свойство вашего домена, но это ваш звонок, где его поставить.

Этот метод/свойство (называемый «IsValid» в моем коде) имеет ответственность за проверку отображения формы в это время.

Не забудьте отделить логику от презентации в вашей программе.

Это сделало бы это.

+0

спасибо, Бруно. – alexander

+0

Извините за давний asnwer, я думал, что проверил ваш ответ как полезный. – alexander

+0

@alexander: эй, никаких проблем! Спасибо, я надеюсь, что ответ был полезен. –

1

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

Вызов Close() в конструкторе вызовет проблемы, потому что окно еще не открыто. У вас появится окно, которое все еще пытается открыть.

Смежные вопросы