如何判斷是否是主窗體關閉?

        我分別編寫了主窗題和子窗體的Closing事件,可當關閉主窗體時,同時也觸發了子窗體的Closing事件。這個讓我很頭疼。
不過我還是找到了解決方法。即在子窗體中加入一個 ”e.CloseReason“ 的事件判斷。
        //子窗體Closing事件
        mFMEntity.FormClosing += new FormClosingEventHandler(mFMEntity_FormClosing);

        
/// <summary>
        
///關閉時,提示自動保存事件
        
/// scott 20070828
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        static void mFMEntity_FormClosing(object sender, FormClosingEventArgs e)
        {
            //判斷是否是主窗體關閉
           注意:下邊判斷是否是主窗體關閉
            if (e.CloseReason != CloseReason.MdiFormClosing)
            {
                ArrayList alChanged 
= new ArrayList();
                
if (mfrmMain.MdiChildren.Length > 0)
                {
                    
//判斷當前窗體是否是FMEntity
                    if (mfrmMain.ActiveMdiChild is WinControls.FMEntity)
                    {
                        WinControls.FMEntity fmChanged 
= (WinControls.FMEntity)mfrmMain.ActiveMdiChild;
                        
if (fmChanged.Mode == 2)
                        {
                            
//將窗體放入ArrayList中,便於傳遞
                            alChanged.Add(fmChanged);
                        }
                    }
                }
                
if (alChanged != null && alChanged.Count > 0)
                {
                    
int iResult = FrontHelper.ShowExitSaveForm(alChanged);
                    
switch (iResult)
                    {
                        
case 1:
                            
//save
                            foreach (WinControls.FMEntity fmentity in alChanged.ToArray(typeof(WinControls.FMEntity)))
                            {
                                
//保存資料
                                FrontHelper.SaveData();
                            }
                            
break;
                        
case -1:
                            
//don't save
                            break;
                        
case 0:
                            
//cancel
                            e.Cancel = true;
                            
break;
                        
default:
                            
//save
                            break;
                    }
                }
            }  
        }


CloseReason 列舉型別
成員名稱 說明
ApplicationExitCall 已叫用 (Invoke) Application 類別的 Exit 方法。 

FormOwnerClosing 正在關閉主控表單。

MdiFormClosing 正在關閉這個多重文件介面 (MDI) 表單的父表單。  
None 關閉的原因尚未定義或無法判斷。

TaskManagerClosing Microsoft Windows 工作管理員正在關閉應用程式。

UserClosing 使用者正透過使用者介面 (UI) 關閉表單,例如按下表單視窗上的 [關閉] 按鈕、選取視窗控制功能表中的 [關閉] 或按下 ALT+F4。

WindowsShutDown 關機之前,作業系統正在關閉所有應用程式。



        /// <summary>
        /// 主窗體Closing事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private
 void FMMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            
if (this.MdiChildren.Length > 0)
            {
                ArrayList alChanged 
= new ArrayList();
                
for (int iForm = 0; iForm < this.MdiChildren.Length; iForm++)
                {
                    
if (this.MdiChildren[iForm] is WinControls.FMEntity)
                    {
                        WinControls.FMEntity fmChanged 
= (WinControls.FMEntity)this.MdiChildren[iForm];
                        
if (fmChanged.Mode == 2)
                        {
                            alChanged.Add(fmChanged);
                        }
                    }
                }
                
if (alChanged != null && alChanged.Count > 0)
                {
                    
int iResult = FrontHelper.ShowExitSaveForm(alChanged);
                    
switch (iResult)
                    {
                        
case 1:
                            
//save
                            foreach (WinControls.FMEntity fmentity in alChanged.ToArray(typeof(WinControls.FMEntity)))
                            {
                                FrontHelper.SaveData();
                            }
                            
break;
                        
case -1:
                            
//don't save
                            break;
                        
case 0:
                            
//cancel
                            e.Cancel = true;
                            
break;
                        
default:
                            
//save
                            break;
                    }
                } 
            }
        }

原文地址:https://www.cnblogs.com/scottckt/p/874537.html