2011-01-22 4 views
3

두 가지 양식의 로그인과 기본 양식이 있습니다. 처음에는 로그인 양식이 표시되고 사용자가 인증되면 기본 양식이 표시되고 로그인 양식이 닫힙니다.내 코드의 문제점은 무엇입니까? C# winforms

다소 효과가 있지만 로그인 양식을 닫고 기본 양식을 표시하려면 btnLogin (로그인 양식의 버튼)을 두 번 클릭해야합니다.

여기 내 코드가 있습니다.

Program.cs (로그인 양식)

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

      Login fLogin = new Login(); 
      if (fLogin.ShowDialog() == DialogResult.OK) 
      { 
       Application.Run(new Main()); 
      } 
     } 
    } 
} 

로그인 양식 당신은 내가 잘못을하고 있어요 생각

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

     private void Login_Load(object sender, EventArgs e) 
     { 

     } 

     private void btnLogin_Click(object sender, EventArgs e) 
     { 
      // initially btnLogin has a DialogResult property set to None 
      Authenticate(); 
     } 

     private void Authenticate() 
     { 
      SqlCeConnection conn = new SqlCeConnection(@"Data source=d:/BIMS.sdf"); 
      conn.Open(); 
      SqlCeCommand cmd = new SqlCeCommand(Properties.Resources.CheckIfUserExists, conn); 
      cmd.Parameters.Add("username", txtUsername.Text.Trim()); 
      cmd.Parameters.Add("password", txtPassword.Text.Trim()); 

      SqlCeDataReader dr = cmd.ExecuteReader(); 
      bool hasRow = dr.Read(); 
      if (hasRow) 
      { 
       btnLogin.DialogResult = DialogResult.OK; 
      } 
     } 
    } 
} 

? 감사합니다 ....

+1

을 변경 당신은 약간의 디버깅을 수행 했습니까? – decyclone

+0

예 ... 내 인증 코드가 사용자를 얻는 것 같습니다. – yonan2236

+0

btnLogin DialogResult 속성이 none으로 설정되어 있기 때문입니다. 사용자가 인증 된 경우에만 'OK'로 설정됩니다. 따라서 대화 상자를 닫으려면 버튼을 두 번 클릭해야합니다. 어떻게해야합니까? – yonan2236

답변

0

Authenticate()에 문제가있을 가능성이 큽니다. 해당 코드를 제거하고 간단하게 가지고 갈 수 있습니까

private void Authenticate() 
{ 
    btnLogin.DialogResult = DialogResult.OK; 
} 

이것은 인증 코드 또는 GUI에 문제가 있는지 알려줍니다. 이전 포스트에서 언급 한 바와 같이

그것은 당신의 authen 코드의 경우는 데이터베이스에 액세스하는 데 좀 더 많은 일을 할 필요가있다 (등, 확인하고이 연결되어 있는지 확인을 ...)

0

, 수도 인증합니다 방법에 문제가있을 ... DB를 액세스하는 데 약간의 시간이 소요되고 있습니다 할 수 있습니다 .. 인증합니다 처리 완료되었는지 알려 도움이 될 코드 아래 ...

private void btnLogin_Click(object sender, EventArgs e) 
{ 
     btnLogin.Enabled = false; 

     // initially btnLogin has a DialogResult property set to None 
     Authenticate(); 
     // better place call to Authenticate in try catch blocks 
     // to prevent btnLogin in a disabled state forever if Authenticate fails with 
     // an exception ... 
     // also if an exception occurs show that in a message box 

     btnLogin.Enabled = true; 
} 

그리고 홈페이지에서

, 사용자가 인증되면 로그인 양식을 닫습니다.

Login fLogin = new Login(); 
      if (fLogin.ShowDialog() == DialogResult.OK) 
      { 
       fLogin.Close(); 
       Application.Run(new Main()); 
      } 
1

원하는 DialogResult을 설정 한 후 양식을 닫을 때 버튼 이벤트 핸들러에 Form.Close()을 호출하면됩니다.

내가 아는 한, 자동으로 발생하지는 않습니다.

나는 다른 방법으로 한 적이 없으며,이 접근법은 항상 나를 위해 일했습니다.

+0

나는 이미 선생님 이셨습니다. 하지만 전체 응용 프로그램도 닫습니다 – yonan2236

1

이 시도 : -

네임 스페이스 로그인

{

정적 클래스 프로그램 응용 프로그램에 대한 /// 주요 진입 점

{ /// . ///

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Login()); 
    } 

}

}

>

스페이스 로그인 { 공용 부분 클래스 로그인 : 폼 { 공개 로그인() { InitializeComponent(); }

private void Login_Load(object sender, EventArgs e) 
    { 

    } 

    private void btnLogin_Click(object sender, EventArgs e) 
    { 
     // initially btnLogin has a DialogResult property set to None 
     Authenticate(); 
    } 

    private void Authenticate() 
    { 
     SqlCeConnection conn = new SqlCeConnection(@"Data source=d:/BIMS.sdf"); 
     conn.Open(); 
     SqlCeCommand cmd = new SqlCeCommand(Properties.Resources.CheckIfUserExists, conn); 
     cmd.Parameters.Add("username", txtUsername.Text.Trim()); 
     cmd.Parameters.Add("password", txtPassword.Text.Trim()); 

     SqlCeDataReader dr = cmd.ExecuteReader(); 
     bool hasRow = dr.Read(); 
     if (hasRow) 
     { 
      Main formmain = new Main(); 
      formmain.Show(); 
      this.Dispose(); // U can also use this.Close(); 
     } 
    } 
} 

}

+0

코드를 테스트 한 결과 전체 응용 프로그램이 닫힙니다. – yonan2236

+0

_ @ Ankush, @yonan : _ 여기에는 '로그인 (Login)'과 '메인 (Main)'형식이 어떻게 상호 작용하는지에 3 가지 문제가 있습니다. ** 1) **'Login' 폼이'Main' 폼을 전혀 생성하지 않는다는 것은 논리적으로 잘못된 것 같습니다; IMO, 이것은 단일 책임 원칙을 위반합니다. 'Main'은'Login' 폼이 닫히고 반환 된 직후'Program' 클래스에서 보여야합니다. ** 2) ** '메인'폼은 모달 ('ShowDialog')이 아닌 모덜 ('ShowDialog')이어야합니다. 그렇지 않으면 프로그램이 너무 빨리 종료됩니다. ** 3) **'로그인'폼은'Dispose' 자체가 아닙니다. 대신에,'Program.Main'에'using' 블록에'새로운 Login()'을 넣으십시오. – stakx

3

그냥

if (hasRow) 
{ 
    // btnLogin.DialogResult = DialogResult.OK; 
    this.DialogResult = DialogResult.OK; 
    this.close(); 
} 
+0

이 맞으면 주 (유일한) 문제가 해결됩니다. –

+0

남은 문제는 무엇입니까? – Navaneethan

+1

Close()를 호출하지 마십시오. 양식의 DialogResult 속성을 설정하면 충분합니다. –

관련 문제