2009-03-30 6 views
1

C# Windows 양식 응용 프로그램을 닫는 데 문제가 있습니다. 현재는 제목이 없거나 아무것도없는 빈 양식 만 제공합니다. 이 작은 알 수없는 창을 닫을 방법을 찾아야합니다.C# Windows Form 닫기 문제

로그인 화면과 실제 앱용으로 2 개의 양식 페이지가 있습니다. 모두 program.cs 파일에 의해 실행됩니다.

program.cs

... 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new PROG1()); 
} 

이 내 프로그램을 실행 비주얼 스튜디오에 의해 생성 단지 기본 주요이다.

그런 다음 우리는 주 프로그램을

PROG1.cs

... 
public PROG1() 
{ 
    Login LoginForm = new Login(); 
    DialogResult a = LoginForm.ShowDialog(); 

    if(LoginForm.ValidLogin == 1) { 
     InitializeComponent(); 
    } else { 
     Application.Exit(); //FAIL 
    } 
} 

당신은 먼저 program.cs 파일이 login.cs의 인스턴스를 호출 PROG1.cs를 호출하는 것을 볼 수 있습니다. 유효한 로그인을 삽입하면 로그인 페이지가 닫히고 주 PROG1이 표시됩니다. 그러나 로그인 폼을 닫으려면 빨간색 X를 클릭하기 만하면 Prog1 및 LoginForm.ValidLogin! = 1이되므로 폼을 초기화하지 않고 폼을 닫으려고 시도합니다. 이것은 단지 그것을 닫지 않고 초기화되지 않은 형태로 남겨 둘 것입니다. 대신 this.close()를 수행하면 런타임 오류가 발생합니다.

어떤 아이디어?

답변

4

이전에는 맨 위에 InitializeComponent 콜을 넣습니다. 초기화되지 않은 변수를 사용하려는 시도는 스스로를 닫으려고하는 것을 포함하여 나쁜 생각입니다.

초기 상태가 표시되지 않도록 PROG1 양식의 속성을 구성하십시오. LoginForm이 반환 된 후 PROG1 코드는 자신을 표시할지 또는 자체를 닫을 지 결정할 수 있습니다.

1

생성자에서 이와 같은 작업을해서는 안됩니다.

거의 없거나 전혀 표시하지 않는 새 항목 양식이 있고 Load 이벤트 또는 기본 양식의 Load 이벤트에 로그인 양식이 표시됩니다. 모달 대화 상자를 표시하면 부모 폼에 액세스 할 수 없으며 로그인에 실패하면 부모를 닫을 수 있습니다.

2

InitializeComponent() 메서드의 내용을 실행하는 데 시간이 오래 걸리므로 실패 할 때 양식을 초기화하지 않는 이유가 무엇입니까?

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    LoginForm login = new LoginForm(); 

    if (login.ShowDialog() == DialogResult.OK && 
     login.ValidLogin == 1) 
    Application.Run(new PROG1()); 
} 

그리고 PROG1의 생성자에서 논리를 제거하십시오.

1

사무엘이 제안한대로 모범 사례를 권장합니다. 당신이 뭔가를 빨리 원한다면, 홈페이지를 비주얼 스튜디오의에 로그인 논리를 이동하려고 생성 :

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Form2 login = new Form2(); 
     if (login.ShowDialog() == DialogResult.Yes) 
     { 
      Application.Run(new Form1()); 
     } 
    } 

private void button1_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.No; 
     this.Close(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.Yes; 
     this.Close(); 
    } 
Form2.cs

에서 Program.cs에서