2013-05-15 5 views
0

컨텍스트 : 내 폼 중 하나에 TreeView가 있습니다. 그 TreeView의 선택에 따라 저는 Pannel에 UserControl을로드합니다. 하나의 pannel은 읽기 전용이지만 다른 pannel에서는 사용자가 데이터베이스에 저장 한 데이터를 수정하거나 추가 할 수 있습니다. 사용자가 TreeView (BeforeSelect 이벤트)에서 새 선택을 시도하고 두 번째 컨트롤 (mod/add)에 있고 저장하지 않은 데이터가 있으면 새 컨트롤을로드하기 전에 저장할 것인지 묻습니다. 문제는 메시지 상자가 표시 될 때 이벤트가 포커스를 잃어서 루프 (약 20 회)에서 호출된다는 것입니다. 또한 아무런 영향을주지 않고 사용자가 messagebox를 클릭했는지에 상관없이 (예 또는 아니오로 새 컨트롤을로드하십시오).이벤트 핸들러에서 messagebox를 사용하는 방법

내 질문은 : 어쨌든 그가 사용자에게 이벤트 처리기에서 수행 할 작업을 묻는 메시지가 있습니까?

나는 내가 한 정도로 명확했다 희망, 미안 영어 첫 langage

/편집

BeforeSelect의 코드와 IsCtrlFormUnsave

private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (IsCtrlFormUnsave()) 
    { 
     e.Cancel = true; 
     //Invoke(new Action(AvertirUser)); //this is in case the save action didn't worked 
    } 
} 

private bool IsCtrlFormUnsave() 
{ 
    if (_ctrlForm != null && _ctrlForm.unsavedChange) 
    { 
     DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
               "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
     if (dr == DialogResult.Yes) 
      if (!_ctrlForm.Save()) 
       return true; 

     _ctrlForm = null; 
    } 
    return false; 
} 

기능 AvertirUser 만이 (가) 포함되지 않습니다 메시지 함

+0

당신이 우리가 당신이 무슨 말을하는지 이해하는 데 도움이되는 몇 가지 예제 코드를 게시 할 수 그런 다음 자신의 저장() 메서드를 호출 할 수 있습니까? –

+0

@JesseCarter 당신이 간다 –

+0

어쩌면 당신은 당신이 원하는 효과를 얻기 위해 다른 이벤트를 조사해 볼 필요가 있습니다. 아마도 새 TreeViewItem을 선택하기 전에 _ctrlForm의 LoseFocus에 연결하십시오. –

답변

1

UserControl에 Close() 메서드를 추가하고 거기에 messagebox 코드를 추가하십시오. 위로 양식에

public void Close() 
    { 
     if (this.unsavedChange) 
     { 
      DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
                "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
      if (dr == DialogResult.Yes) 
      { 
       this.Save(); 
      } 
     } 
    } 

, 당신은 할 수 있습니다 :

private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
    { 
     if (_ctrlForm != null) 
     { 
      _ctrlForm.Close(); 
      _ctrlForm.Dispose(); 
      _ctrlForm = null; 
     } 
    } 
1

선택 사항이 사용자 조치인지 또는 잔향인지 확인해야합니다 사용자의 t 동작은 고정

하나의 방법이 다른 bool 값을 추가하는 등 취소 :

bool IsChecked=false; 
private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (!IsChecked && IsCtrlFormUnsave()) //Check if it's already confirmed with the user 
    { 
     e.Cancel = true;   
    } 
} 

private bool IsCtrlFormUnsave() 
{ 
    IsChecked=true; //set it to true to jump out of the loop 
    if (_ctrlForm != null && _ctrlForm.unsavedChange) 
    { 

     DialogResult dr = MessageBox.Show("Le formulaire présentement ouvert contient des données qui n'ont pas été sauvegardées. Voulez-vous les enregistrés avant de poursuivre?", 
               "Attention!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
     if (dr == DialogResult.Yes) 
      if (!_ctrlForm.Save()) 
       return true; 

     _ctrlForm = null; 
    } 
    return false; 
} 

그리고 다시 second control를로드 할 때 IsChecked=false를 재설정해야합니다.

관련 문제