2017-02-02 2 views
2

I는 사용자의 문화를 설정하는 콤보 박스가 호출되는 x 회. FormClosing 이벤트가 여러 번

내 FormClosing 이벤트입니다 :

private void FrmParent_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (MessageBox.Show(this, Properties.Resources.msgExit, this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) 
      e.Cancel = true; 
    } 

이 내 콤보 상자 값이 이벤트 변경 :

void cbCulture_ToolValueChanged(object sender, ToolEventArgs e) 
    { 
     ComboBoxTool cbCulture = (ComboBoxTool)sender; 
     var culture = cbCulture.Value.ToString(); 

     FormHelpers.SetCulture(culture); 

     this.Controls.Clear(); 
     this.InitializeComponent(); 
     InitForm(); 
    } 

내가 청소하고 새로 UI를 변경하는 컨트롤을 초기화해야 문화하지만 그렇게함으로써 내가 InitializeComponent()에 여러 번 FormClosing 이벤트를 할당 오전? 이 문제를 어떻게 피할 수 있습니까?

+2

그 때문에 InitializeComponent 때문에 이벤트가 추가되었습니다. –

+0

확실히, 이벤트에 대한 여러 구독. 컨트롤 컬렉션을 지우고 initializecomponent를 호출해야 할 필요가 있습니까? 'InitForm'의 배정을 통해 문화권 고유의 속성 (텍스트, 왼쪽에서 오른쪽, 무엇이든간에)을 컨트롤 레이아웃에 그대로 지정하는 것으로 충분합니까? – dlatikay

+0

각 문화권 변경에서'InitializeComponent()'를 호출하지 않습니까? – Pikoh

답변

4

그 이유는 InitializeComponent이므로 그 방법은 forms design modeproperties/events입니다. 그래서 매회마다 FormClosingevent을 하나 더 더합니다. 이 this.InitializeComponent();

this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.FrmParent_FormClosing); 

주 이상이 줄을 추가하지 않도록하려면를 그것의 InitializeComponent에서 FormClosing 이벤트 처리기 추가 라인 제거에만 FormClosing 이벤트 문제

+0

yah - =이 문제를 해결하지만 더 많은 문제가 발생할 수 있음을 알게되었습니다. 컨트롤을 정리하고 초기화하지 않고 UI를 변경할 수있는 방법이 있습니까? –

+1

YourFile.designer.cs에서 모든 디자인 타임 이벤트를 제거하고 코드에서 수동으로 설정할 수 있습니다. 그런 식으로 InitializeComponent() 메서드는 모든 이벤트를 여러 번 추가하지 않습니다. –

1

에게 해결 :

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmParent_FormClosing); 

당신은 할 수 있습니다 이것을 manunally하거나 디자이너를 사용하여 핸들러를 삭제하십시오.

그런 다음 디자이너를 사용하여이 이벤트 핸들러를 추가하는 대신 디자이너를 수동으로 추가하십시오. InitializeComponent 호출 직후 생성자에 동일한 행을 추가합니다.

그럼에도 불구하고 InitializeComponent을 호출하면 UI 상태가 다시 초기화됩니다. 어쩌면 this one (개인적으로 시도하지 않았고 보증 할 수없는)과 같은 다른 솔루션을 찾을 수도 있습니다.

관련 문제