阿宽

Nothing is more powerful than habit!
随笔 - 692, 文章 - 4, 评论 - 388, 阅读 - 149万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on   宽田  阅读(955)  评论(4编辑  收藏  举报
        我分別編寫了主窗題和子窗體的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;
                    }
                } 
            }
        }

编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
点击右上角即可分享
微信分享提示