2013-05-15 89 views
0

上下文:我的窗體中有一個TreeView。根據該TreeView的選擇,我在一個面板中加載一個UserControl。一個pannel是隻讀的,但在另一個pannel中,用戶可以修改/添加我保存在數據庫中的數據。如果用戶試圖在TreeView中做出新的選擇(事件BeforeSelect)並且他在第二個控件(mod/add)中,並且他有未保存的數據,我想問他在加載新控件之前是否要保存。問題是,當顯示消息框時,事件有點失去焦點,並在循環中調用(大約20次)。另外,不管用戶點擊消息框(是保存還是不加載新控件),都不會產生影響。如何在事件處理程序中使用消息框

所以我的問題是:無論如何要問用戶他想在事件處理程序中做什麼?

我希望我是清楚的足夠多,遺憾的英語不是我的第一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只containt一個消息框

+0

你可以張貼一些示例代碼,以幫助我們理解你在說什麼? –

+0

@JesseCarter你去了 –

+0

也許你需要考慮尋找不同的事件來獲得你想要的效果。在甚至允許選擇新的TreeViewItem之前,可能會在_ctrlForm中插入LoseFocus –

回答

1

向您的UserControl添加一個Close()方法,並在其中放置消息框代碼。然後,它可以調用自己的Save()方法:

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

你需要檢查選擇是用戶操作還是一個rever用戶的科技行動綱領取消等固定的

一個辦法是增加另一個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

相關問題