因为我在子窗体里的FormClosing事件调用了主窗体的控件,然而发现,在关闭主窗体的时候,仍然会运行这个子窗体的Closing事件,请问怎么解决?
子窗体中:        public delegate void MDIButton(string BT);
        public MDIButton ShowButton;
        public MDIButton AddButton;
        private void Login_FormClosing(object sender, FormClosingEventArgs e)
        {
            string BT = "";
            if (Program.Tools != null){ AddButton(BT); }
            else { ShowButton(BT); }
        }父窗体中:        private void MDILogin_Click(object sender, EventArgs e)
        {
            Login f2 = new Login();
            f2.ShowButton += new Login.MDIButton(ShowButton_Method);
            f2.AddButton += new Login.MDIButton(AddButton_Method);
            f2.Owner = this;
            MLogin.Visible = false;
            f2.ShowDialog();
        }        public void ShowButton_Method(string sButton)
        {
            MLogin.Visible = true;
        }        public void AddButton_Method(string aButton)
        {
            this.MTools.Nodes.Clear();
            this.MTools.ImageList = this.MTicon;
            TreeNode nodeParent;
            for (int i = 0; i < Program.Tools.Count; i = i + 3)
            {
                nodeParent = this.MTools.Nodes.Add("", Program.Tools[i].ToString(), "TWait", "TSelect");
            }
        }

解决方案 »

  1.   

    看一些线程方面的参考资料吧。
    主线程与子线程之间的关系。话说如果主线程关掉了 子线程还会继续工作吗?。==>>子窗体也会关闭吧
    如果只是不想看到主窗体就把它的visualable 设成false可以不
      

  2.   

    既然使用 ShowDialog(),还设置 Owner 属性干啥啊?
      

  3.   

    我刚学这个,不太懂,从别人几个代码中拼起来的,这样用是不矛盾了还是怎么了,还有就现在取消了Owner后发现一个奇怪的问题
    就是主窗体关闭的时候,我想更新Access数据库,代码如下private void MDIBOX_FormClosing(object sender, FormClosingEventArgs e)
            {
                msCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Program.Userset + @"\Set.mdb;Jet OLEDB:Database Password=qwe");
                if (msCon.State == ConnectionState.Closed) msCon.Open();
                string userSql = "update Person set UserName='" + System.Environment.UserName + "',Status='Offline'" + ",LastTime='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'";
                msCmd = new OleDbCommand("", msCon);
                msCmd.CommandText = userSql;
                try
                { msCmd.ExecuteNonQuery(); }
                catch (System.Exception E)
                { MessageBox.Show(E.ToString()); }
                finally
                { msCmd.Dispose(); }
                if (msCon.State == ConnectionState.Open) msCon.Close();
            }发现走到下面这一步的时候就不往下走了if (msCon.State == ConnectionState.Closed) msCon.Open();
      

  4.   

    如果只是想解决这个问题,最简单的办法是在closing事件里面加一句
    this.FormClosing-= new FormClosingEventHandler(Login_FormClosing);
    下次关闭时不再有关闭方法,自然不会再触发你关闭主窗体时再次执行了这个窗体的关闭事件可能是因为内存中尚未将Login释放,你可以将“Login f2 = new Login();”这句换成“            using (Login f2 = new Login())“,再把后面的代码用大括号括起来。并且把”f2.Owner = this;“这句话删掉。
      

  5.   

    MLogin这个东东是干啥的,貌似它只有隐藏没有关闭
      

  6.   

    MLogin应该是主界面上的登录按钮,登录窗口是f2
      

  7.   

    MLogin应该是主界面上的登录按钮,登录窗口是f2理解正确,是MDI窗体的一个登录按钮,点了之后弹出登录窗体,按钮隐藏,当登录窗体不是点登录进去而是点关闭时,这按钮会重新显示。
      

  8.   

    我将f2.Owner = this删除后,还是像我在4楼说的情况,走到那一步会中断不往下走,主窗体的关闭事件没完成,窗体关闭不了。
    把主窗体关闭事件中更新的过程全部代码删除后,调试往下走,不会再执行登录窗体的关闭事件。
      

  9.   

    不删除这句就没问题?
    如果是这样,你调试看下那个msCon在删除前后有什么不一样的地方吧,光看你贴出来的代码,可能是Program.Userset 赋值在删除后没成功