2017-11-13 3 views
-1

저는 C#으로 WinForm 애플리케이션을 작성하고 있습니다. Button 클릭에 Form C을 여는 Form A이 있습니다. 이제 Form C을 열기 전에 비밀번호 입력 화면 Form B을 추가하고 싶습니다. 입력 한 암호가 올 Y 르면 Form C이 열리고 오류 메시지가 표시됩니다. Form B에는 TextBox 컨트롤과 확인Button 컨트롤이 있습니다.DialogShow()를 사용하여 비밀번호 입력을받지 못합니다.

/*Form A*/ 
FormB fb; 
private void BtnClick(object sender, EventArgs e) { 
    DialogResult result; 
    //fb can open once at a time 
    if(fb == null){ 
     fb = new FormB(); 
     fb.FormClosed += new FormClosedEventHandler(FormB_FormClosed); 

     //This seems to be not working 
     result = fb.ShowDialog(); 
    } 
    else //FormB already open. Do nothing 
     return; 

    //Only if password entered is correct, proceed 
    if(result == DialogResult.Yes){ //result == cancel 
     //Code to open Form C   //Program never reaches here 
    } 
} 

//Upon closing FormB, reset it to null 
private void FormB_FormClosed(object sender, FormClosedEventArgs e){ 
    if(fb != null) 
     fb = null; 
} 

/* Form B */ 
private const string password = "xxxyyyzzz"; 
private void BtnPW_Click(object sender, EventArgs e){ 
    bool result = Verify(); 
    if(result){ 
     BtnPW.DialogResult = DialogResult.Yes; 
    } 
    else{ 
     MessageBox.Show("Error: Incorrect password"); 
     BtnPW.DialogResult = DialogResult.No; 
    } 
    this.Close();    //Added 
} 

private bool Verify(){ 
    if(TxtBox.Text == password) 
     return true; 
    else 
     return false; 
} 

누군가이 코드의 문제점을 말해 줄 수 있습니까? Form A의 두 번째 if 문에 도달하지 않습니다.

편집 : 올바른 암호를 입력하고 Form B의 버튼, Form A에서 result는 "DialogResult.Cancel`를 얻을 수

+1

* "이것은 작동하지 않는 것 같습니다."* - 매우 유익한 발언은 아닙니다. 그 라인에 도달했을 때 당신은 무엇을 기대하고, 대신 무엇을 보았습니까? 'BtnClick'의 상단에 중단 점을 넣었습니까? 그리고 실제로 호출되는 것을 확인했습니다. 그리고 코드를 통해 기대하는 경로를 실제로 따르고 있습니까? –

+0

사과드립니다. 몇 문장을 건너 뛰었으므로 방금 문제를 수정했습니다. 폼 B에 올바른 비밀번호를 입력 했는데도 내 C 코드가 열리지 않습니다. –

+0

FormC를 여는 코드가 없습니다. 일부를 추가하십시오. –

답변

1

에 충돌하더라도 당신은 알리고 Form.Close 방법, 그 형태의 다음 DialogResult를 속성을 호출합니다. 비록 DialogResult.Cancel을 DialogResult.Cancel로 설정해도 양식이 DialogResult.None이 아닌 다른 것으로 설정되어야합니다.

코드가 아닌 것처럼 보입니다. 모달 대화 상자를 처리하는 데 주로 사용되는 문자입니다.
ShowDialog가 C ode, 호출 된 폼이 닫히거나 숨겨 질 때까지이 호출을 종료하지 않으므로 FormB의 전역 변수를 유지하고 FormA의 FormB의 FormClosed 이벤트 처리기를 처리 할 필요가 없습니다.

private void BtnClick(object sender, EventArgs e) 
{ 
    using(FormB fb = new FormB()) 
    { 
     // Here the code returns only when the fb instance is hidden 
     result = fb.ShowDialog(); 
     if(result == DialogResult.Yes) 
     { 
      //open Form C   
     }  
    }  
} 

이 시점에서 버튼의 DialogResult를 속성을 변경하려고하지 않는, 이제 FormB 코드에 알리고 Form.Close에 대한 호출을 제거해야하고 FormB의 DialogResult를 속성을 직접 설정이 작동하지 않습니다 폼을 숨기려면 두 번째 클릭이 필요하다. 대신 폼의 DialogResult 속성을 직접 설정한다.

이렇게하면 양식이 숨겨지고 (닫히지 않음) 코드가 FormA의 ShowDialog 호출을 종료합니다. using 블록에서 여전히 FormB 인스턴스를 사용하여 속성을 읽고 적절한 경로를 사용할 수 있습니다. 코드가 using 블록에서 나올 때 fb 인스턴스는 자동으로 닫히고 존재하지 않게됩니다.

+0

감사합니다.하지만 BtnPW를 클릭 한 후에도 'Form B'가 닫히지 않습니다. 또한 Close()를 추가해도 폼이 닫히지 않습니다. 그것은 BtnPW를 두 번 클릭 한 후 양식을 닫습니다 ... –

+0

OOps, 나는'BtnPW.DialogResult = DialogResult.No/Yes'를 가지며, 이것은 문제를 일으켰습니다. 고맙습니다! 'this.DialogResult = DialogResult.No/Yes'로 변경하자마자 작동을 시작했습니다. < –

+0

위에서 설명한 것처럼 버튼 click 이벤트 내에서 Button의 DialogResult 속성을 변경하면 안됩니다. 코드가 이벤트 처리기에서 종료 한 후 양식 엔진이 DialogResult 속성을 읽는다는 보장이 없습니다. 실제로 이벤트 핸들러를 호출하기 전에이 속성을 읽습니다. 경험 한 것처럼 두 번째 클릭을 통해 폼을 닫아야합니다. 폼의 DialogResult 속성을 직접 설정하면이 컨텍스트로 이동하는 올바른 방법입니다. – Steve