2009-11-20 4 views
4

(VS2005, .Net 2.0)C# CancelButton이 대화 상자를 닫습니까?

ShowDialog() 메서드를 사용하여 대화 상자로 표시되는 양식이 있습니다. 폼의 CancelButton 속성은 폼의 단추로 설정됩니다. 해당 버튼의 DialogResult를 None으로 설정하더라도 단추를 클릭해도 대화 상자가 닫힙니다. 이런 일이 일어나기를 원하지 않습니다. 대화 상자를 닫을 지 여부를 제어 할 수 있기를 원합니다.

이 문제는 해당 폼의 AcceptButton 함께 발생합니다 - 단추의 DialogResult가 none으로 설정되어 있으면 어떤 처리가 필요한지를 결정한 다음 양식의 DialogResult가 닫히도록 수동으로 설정할지 여부를 결정할 수 있습니다.

Esc 키를 눌렀을 때 "클릭"되어야하는 버튼을 나타 내기 위해 CancelButton 속성이 soley를 의미한다고 생각했습니다. 이는 AcceptButton이 Enter 키를 눌렀을 때 "클릭"버튼 만 나타내는 것으로 생각됩니다. 내가 틀렸어? 양식이 닫히는 다른 이유가 없어 졌습니까? 아니면이 버그입니까?

편집 : 코드가 추가되었습니다. 이것은 대화 상자 양식 (양식 2)과 취소 버튼 (버튼 1)입니다. 는 취소로 설정 DialogResult를이없는, 버튼은 폼의 CancelButton을 취소가 있지만, 버튼을 누르면 여전히 형태

private void InitializeComponent() 
    { 
     this.button1 = new System.Windows.Forms.Button(); 
     this.SuspendLayout(); 
     // 
     // button1 
     // 
     this.button1.Name = "button1"; 
     this.button1.Text = "button1"; 
     // 
     // Form2 
     // 
     this.CancelButton = this.button1; 
     this.Controls.Add(this.button1); 
     this.Name = "Form2"; 
     this.Text = "Form2"; 
     this.ResumeLayout(false); 
    } 
+1

내가 코드를 게시해야한다고 생각합니다 – ChrisF

답변

7

또한 Alt + F4를 누른 상태에서 X 버튼을 눌러 양식을 닫을 수 있으며 두 방법으로 모두 취소 버튼 클릭 이벤트가 발생하지 않습니다.

이러한 상황을 처리하는 경우가 아니면 slurdge의 조언을 따르고 FormClosing 이벤트에서 양식이 닫히지 않도록하는 것이 가장 좋습니다.

편집 : 는 또한 당신은 속성 창에서 없음으로 다시 버튼의 DialogResult를 변경하는 경우, 기본 값으로 변화하고 있습니다. 값이 속성의 기본값이면 * .Designer.cs에 유지되지 않습니다. 지속 된 경우에도 양식 초기화 코드는 * .Designer의 마지막에 배치됩니다.CS와 함께 없음을 무시하지 않을 것이다 때문에 라인의 취소

public void set_CancelButton(IButtonControl value) 
{ 
    base.Properties.SetObject(PropCancelButton, value); 
    if ((value != null) && (value.DialogResult == DialogResult.None)) 
    { 
     value.DialogResult = DialogResult.Cancel; 
    } 
} 

당신은 생성자 후 다시 없음으로 변경할 수 있습니다 : 이전 라인이 수행 리플렉터에서 확인할 수 있듯이

this.CancelButton = this.button1; 

InitializeComponent() 호출.

+0

흠. 나는 X 버튼을 감추었지만 Alt-F4가 대화 상자를 닫을 것이라는 사실을 깨닫지 못했습니다. 실제로 slurdge의 실용적인 솔루션이 가장 좋은 것 같지만 디자이너의 None으로 변경했을 때 버튼의 DialogResult가 취소로 설정되는 이유와 이유에 대해 궁금합니다. – Rawling

+0

내 대답 편집을 참조하십시오. –

+0

나는 당신의 편집이 무슨 일이 일어나고 있는지를 설명하는 것에 가장 가깝다 고 생각한다. CancelButton 속성은 런타임에 버튼의 DialogResult를 설정하여 설정된다. 나는 어째서 이런 일이 일어날 지 어둠 속에 있지만, 마이크로 소프트에서 누군가에게 묻지 않고 나는 그것에 대한 답을 얻을 수 있을지 확신하지 못합니다. – Rawling

2

그것은 기본 동작을 닫습니다.

MSDN에서

:

이 속성은 사용자가 응용 프로그램에서 ESC 키를 누를 때 발생하는 기본 동작을 지정할 수 있습니다. 이 속성을 사용하면 마우스로 취소 버튼을 수동으로 클릭하는 대신 변경 사항을 적용하지 않고 ESC 키를 눌러 창을 닫을 수 있으므로 사용자가 간단한 양식을 빠르게 탐색 할 수 있습니다.

CancelButton Property

+0

"이 버튼은 Esc 키를 누를 때 눌려집니다. - 그리고 버튼 누름은 양식을 닫는 것을 포함 할 수 있습니다."가 아니라 Esc를 누를 때이 버튼을 누르십시오. 버튼을 눌러 양식을 닫으십시오. " – Rawling

+1

URL을 확인 했습니까? 커뮤니티 콘텐츠도 포함되어 있습니다. [나는 눈치 채지 못했습니다;] Visual Studio 디자이너에서 단추를 CancelButton으로 설정하면 단추의 DialogResult를로 설정하는 부작용이 있습니다. 취소. 모달 대화 상자의 경우이 버튼을 클릭하면 양식이 자동으로 닫힙니다. 폼이 닫히지 않도록하려면 DialogResult 속성을 지우거나 클릭 핸들러에서이 코드를 사용하십시오. this.DialogResult = DialogResult.None; – Anuraj

+0

흠. 디자이너에서 CancelButton을 설정하면 단추의 DialogResult도 취소로 설정됩니다. 그러나 Designer의 단추의 DialogResult를 None으로 변경하더라도 여전히 창을 닫습니다. 사실, 디버깅 할 때, 단추의 DialogResult를 단추의 DialogResult를 none으로 설정해도 단추의 DialogResult는 여전히 취소 된 것으로 나타났습니다. 여기서 뭐하는거야? – Rawling

5

당신이 양식 폐쇄의 유효성 검사를 수행 할 것으로 보인다.
FormClosing 이벤트는이 작업에 가장 적합합니다. 이렇게하면 가까운 코드를 제어 할 수있는 동일한 코드를 사용할 수 있습니다.
닫기를 방지하려면 Cancel 속성을 true로 설정하십시오. FormClosing을 참조하십시오.

+1

이것은 편리하고 아마도 내가 끝낼 것입니다. 내가 정말로 걱정하고있는 것은 버튼이 폼을 처음부터 닫게하는 이유입니다. 내가 말하지 않았을 때입니다. – Rawling

+0

+1 이것이 내가하는 일입니다. – Hath

1

이 문제를 button_click 이벤트에서 처리하는 대신 form_closing 이벤트에서 처리하십시오.

MyForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (DialogResult == DialogResult.Cancel) 
    { 
     // do my processing ... 
     if (false) 
     e.Cancel = true; // stop the form from closing 
    } 
} 

나는 DialogResult.OK이 취소입니다! = 난 아무것도 가정, 여기 내 동의 버튼 코드를 처리,하지만 당신은 당신을 위해 편안하고 무엇이든 할 수 있습니다.

관련 문제