2014-01-17 3 views
1

일 때 이 필요합니다. 따라서 Modal이 필요하므로 child.ShowDialog()을 사용하여 양식을 Modal으로 만드십시오. 이 form에있는 동안 사용자가 close/cancel 버튼을 선택하면 DialogResult 버튼을 클릭하여 닫으려고하는지 묻습니다. 사용자가 DialogResult에서 OK을 선택할 때 문제가 발생합니다. DialogResult box을 닫으려면 OK에서 두 번 클릭해야합니다. 나는 DisposeClose을 사용하면 child form을 첫 번째 클릭에서 제외시킬 수 있지만 아직 DialogResult box이 남아 있음을 발견했습니다. 아래 코드에서 누락 된 부분은 OK을 클릭 한 후 DialogResult boxForm을 닫을 수 있습니까?DialogResult는 Form Modal이

private void closeButton_Click(object sender, EventArgs e) 
{ 
    if (calBackgroundWorker.IsBusy) 
    { 
     DialogResult dialogResult = MessageBox.Show("The Compass Calibration is already in progress, are you sure you wish to cancel?", "Stop Calibration", MessageBoxButtons.OKCancel); 
     if (dialogResult == DialogResult.OK) 
     { 
      calibrationInProgress = false; 
      calBackgroundWorker.CancelAsync(); 
      this.Dispose(); 
      this.Close(); 
     } 
    } 
    else 
    { 
     this.Close(); 
    } 
} 
+0

가나요? – TyCobb

+0

그래서'MainForm' ->'ChildForm' (모달) ->'MessageBox'입니다. 'ChildForm'을 닫을 때 당신은'MessageBox' 확인을 요구합니다. 사용자가'OK'를 선택하면'ChildForm'을 닫고 싶습니다. 그 결과로'MainForm'을 닫고 싶습니까? – Erik

+0

@SiLo'Modal' 인'ChildForm'과'Modal' 인'MessageBox'를 닫고 싶습니다. ** 부모님을 닫고 싶지 않습니다 ** – KSdev

답변

0

SiLo 대답으로 나는 훨씬 더 얻을 수 있었다, 그러나 단지 DialogResultChildForm을하지 닫을 것이다. 두 가지를 모두 닫으려면 this.DialogResult = DialogResult.OK을 추가해야했습니다. 아래의 코드는 모두 Modal 창을 닫는 완벽하게 작동합니다 :

private void closeButton_Click(object sender, EventArgs e) 
{ 
    if (calBackgroundWorker.IsBusy) 
    { 
     DialogResult dialogResult = MessageBox.Show("The Compass Calibration is already in progress, are you sure you wish to cancel?", "Stop Calibration", MessageBoxButtons.OKCancel); 
     if (dialogResult == DialogResult.OK) 
     { 
      calBackgroundWorker.CancelAsync(); 
      this.DialogResult = DialogResult.OK; 
     } 
     return; 
    } 
    this.Close(); 
} 

그리고 이벤트 핸들러 : 당신은 두 번`closeButton.Click` 이벤트에 가입

void calBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) 
    { 
     this.Close(); 
     return; 
    } 
} 
1

첫째, 당신은 Close() 충분의 Dispose() 전화가 필요하지 않습니다. 그러나 BackgroundWorker.CancelAsync() 호출은 작업을 즉시 (동 기적으로) 취소하지 않습니다. 즉, DoWork의 구현에,하지만 당신은 여전히 ​​당신이 취소 된 상태를 처리 할 수있는 RunWorkerCompleted 이벤트를 얻을 것이다

을 당신은 같은 것을 원한다. 이벤트 핸들러에서 다음

void closeButtonClicked(object sender, EventArgs e) 
{ 
    if(backgroundWorker.IsBusy) 
    { 
    var result = MessageBox.Show("..."); 

    if(result == DialogResult.OK) 
     backgroundWorker.CancelAsync(); 

    return; 
    } 

    this.Close(); 
} 

을 :

void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if(e.Cancel) 
    { 
    this.Close(); 
    return; 
    } 
} 
+0

이것은'DialogResult'를 닫지 만'ChildForm'은 닫히지 않습니다. – KSdev

+0

또한,'event handler'에서'if (e.Cancelled)'를 사용하고 있습니다. – KSdev