问题,如标题所描述:问题场景:           vs.net 2005开发环境下:1. 新建三个窗体分别为(Form5(启动窗体), Form6,Form7);2.新建用户控件UserControl2;          3.UserControl2中放置一TreeView控件(包含三节点分别为: 父节点(节点0), 子节点(节点1,节点2),并添加    treeView1_AfterSelect(object sender, TreeViewEventArgs e)事件,代码如下:             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            
            if (treeView1.SelectedNode.Name == "节点1")
            {
                Form6 f6 = new Form6();
                f6.Show();
                this.ParentForm.Close();--[color=#FF00FF]实质问题就出现在这个地方

            }
            if (treeView1.SelectedNode.Name == "节点2")
            {
                Form7 f7 = new Form7();
                f7.Show();
                this.ParentForm.Close();--实质问题就出现在这个地方
            }
        }[/color]          4. 分别在拖放用户控件UserControl2到窗体Form6,Form7;操作演示:          1. 打开Form5窗体,点击Button1按钮打开Form6子窗体,同时隐藏Form5父窗体;            button 代码如下:        private void button1_Click(object sender, EventArgs e)
        {
            Form6 f6 = new Form6();
            f6.Show();
            this.Hide();
            this.Visible = false;
        } 
   2. 当我在Form6里面点击了treeview1的父节点(节点0)之后,再点击子节点的时候,报出bug:       有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。************** 异常文本 **************
System.ObjectDisposedException: 无法访问已释放的对象。
对象名:“TreeView”。
   在 System.Windows.Forms.Control.CreateHandle()
   在 System.Windows.Forms.TreeView.CreateHandle()
   在 System.Windows.Forms.Control.get_Handle()
   在 System.Windows.Forms.TreeView.TvnSelected(NMTREEVIEW* nmtv)
   在 System.Windows.Forms.TreeView.WmNotify(Message& m)
   在 System.Windows.Forms.TreeView.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
 3. 如果你单是在两个子节点之间点击却不会有这个问题. 很是郁闷, 请问该如何解决??????

解决方案 »

  1.   

    进程都被你结束掉了,tree还怎么操作?
      

  2.   

    并没有结束进程,启动窗体并没有关闭,只是visible=false;而已.我是在子窗体里面做以上操作的.
      

  3.   

    this.ParentForm.Close();--实质问题就出现在这个地方 
    最开始的那个窗体能关? 我一般是HIDE 
      

  4.   

    昨天看到高人是用FindWindow并关掉刚开始的那个窗体
      

  5.   

    又有人发现vs的bug了?              if (treeView1.SelectedNode.Name == "节点1") 
                { 
                    Form6 f6 = new Form6(); 
                    f6.Show(); 
                    this.ParentForm.Close();
                  } 
    else if (treeView1.SelectedNode.Name == "节点2") 
                { 
                    Form7 f7 = new Form7(); 
                    f7.Show(); 
                    this.ParentForm.Close();--实质问题就出现在这个地方 
                } 
    如果不加这个else的话,貌似
     this.ParentForm.Close();
    关闭窗口后,自己也销毁了,下面再去
    if (treeView1.SelectedNode.Name == "节点2") 
    treeView1就访问不到了吧
      

  6.   

    进程都被你结束掉了,tree还怎么操作?
      

  7.   

    TreeView在发出AfterSelect事件后,还要做其它事情。比如如果有旧的选择节点,那它还要得到自己的矩形大小,并刷新自己,以便比如重置旧的选择节点的颜色。在响应AfterSelect的事件中调用this.ParentForm.Close();会导致父亲窗口销毁所有的子控件。也就是说TreeView也就被销毁了。当treeView1_AfterSelect函数返回后,由于TreeView已经销毁了,刷新TreeView就会导致ObjectDisposedException - 无法访问已释放的对象的异常。没有处理的异常就爆了你的整个程序。我不认为这是微软的Bug。建议你改动代码,不要在treeView1_AfterSelect调用this.ParentForm.Close()。比如你可以保存一个窗口的引用,进行显示以及隐藏,而不是每次new一个然后close。
      

  8.   

    各位大牛小牛, 可能你们还没有看清楚,上面的问题关键所在.我是在用户控件里面执行的这个操作(this.ParentForm.Close();)的也就是所次句实质是关闭UserControl2所在窗体,而不是所在
    窗体的父窗体.实际上父窗体(Form5)一直是没有被关闭的(一开始就执行了: this.Hide();this.Visble = false;)的嘛.我的理解是这样的,代码也是这样写的.(程序报出的bug: 是在我点击TreeView的SelectedNode.Name == "节点0";以后再点击其他节点而报出的;)其他如果把点击"节点0"的操作也执行
    {FormXXX fXXX = new FormXXX(); 
                    fXXX.Show(); 
                    this.ParentForm.Close(); }的相关操作就可以避免这个bug.
      

  9.   

    treeView1在UserControl里面。treeView1_AfterSelect()写在UserControl里面。this就是UserControl。this.ParentForm就是包含UserControl的那个窗口。this.ParentForm.Close()就会销毁串口,销毁窗口就会销毁子控件UserControl,销毁UserControl就会销毁TreeView。