本帖最后由 u010466340 于 2013-07-06 16:43:34 编辑

解决方案 »

  1.   

     定义类的字段:Form1 F1,F2,F3;在构造函数中初始化窗体字段: F1= new Form1();F2= new Form2();
     F3= new Form3();,然后在节点中直接Show出来。
      

  2.   

    方法太多了,可繁可简,能否把需求说一下?
    如果这三个Form是一种类型的,处理方法又不一样了 还有switch case这种写法是违反“开发-闭合”原则的,不建议使用
      

  3.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
      

  4.   

    我试了一下,定义了
    public Form1 F1;
    public MainForm()
            {
                InitializeComponent();
                F1 = new Form1();
            }但是点节点后页面出不来,断点F1.Show(); 是能走到这行的
      

  5.   

    是这样的,这个是主Form,把对应节点的Form显示出来,3个Form都是不同的,因为每个Form里都有些线程,我不想再NEW一个新的Form,所以想在选择节点的时候,把第一个new的Form再显示出来,不开新的Form了。
      

  6.   

    本帖最后由 caozhy 于 2013-07-06 19:34:30 编辑
      

  7.   

    例如你可以写 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        Form1.Show();
                        break;private Form1 F1;public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
         }
         return F1;
      }   
    }这样,不管调用多少次Form1属性,都回首先判断 if(F1==null),仅仅初始化一次。
      

  8.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥,有话好好说,天气热,喝点凉茶哈。
      

  9.   

    太早去new,就完全没有必要了。
      

  10.   

    可以定义一个静态变量,每次加载前判断一下看是否为null,如果是null,则实例化,否则直接引用。
      

  11.   

    谢谢详细的指点。
    我试了一下,第一次能Show出来,第二次就显示不出来了。
      

  12.   

    这个要改进一下要不然有BUGprivate Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null || F1.IsDisposed) <-这增加个窗体销毁判断,。
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
         }
         return F1;
      }   
    }
      

  13.   

    谢谢详细的指点。
    我试了一下,第一次能Show出来,第二次就显示不出来了。什么叫做“第二次”呢?你手工关闭窗体?假设你打算共享同一个窗体,那么你就应该把这个窗体的Close(通常在右上角)的按钮去掉,并且在Form1(以及另外两个窗体)上放一个按钮,这个按钮Click后执行一句this.Hide();那么如果你的设计概念中是要让用户自由地关闭窗体的话,还干么要说“仅new一次”啊?这不是自相矛盾了吗。这种自相矛盾,你就写出了“分析时与动手时完全不一致”的垃圾代码了。
      

  14.   

    这个要改进一下要不然有BUGprivate Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null || F1.IsDisposed) <-这增加个窗体销毁判断,。
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
         }
         return F1;
      }   
    }
    一样是第一次能显示,第二次不能显示,纳闷啊- -
      

  15.   

    谢谢详细的指点。
    我试了一下,第一次能Show出来,第二次就显示不出来了。什么叫做“第二次”呢?你手工关闭窗体?假设你打算共享同一个窗体,那么你就应该把这个窗体的Close(通常在右上角)的按钮去掉,并且在Form1(以及另外两个窗体)上放一个按钮,这个按钮Click后执行一句this.Hide();那么如果你的设计概念中是要让用户自由地关闭窗体的话,还干么要说“仅new一次”啊?这不是自相矛盾了吗。这种自相矛盾,你就写出了“分析时与动手时完全不一致”的垃圾代码了。
    谢谢指教。
    是这样的,我是用一个主Form,在里面做了个Panel来显示其他的Form,然后左边用TreeView做了个导航的功能,这样点节点就直接显示不同的Form。
    如果是这样的话,在我点不同的节点切换Form是会把原来的Form关闭的吗?
      

  16.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。
      

  17.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
      

  18.   


    可能没人人告诉过你正确的Form编程概念,你以为Form只要被用户Close了,以后可以随便用代码再次Show。在Winform的这个控件中,一旦执行完Closing、Closed等过程,你就不要再去Show了。否则会产生意外的bug。如果你要让Form隐藏,以后再Show(),那么你应该调用其Hide()方法。
      

  19.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -
      

  20.   


    可能没人人告诉过你正确的Form编程概念,你以为Form只要被用户Close了,以后可以随便用代码再次Show。在Winform的这个控件中,一旦执行完Closing、Closed等过程,你就不要再去Show了。否则会产生意外的bug。如果你要让Form隐藏,以后再Show(),那么你应该调用其Hide()方法。
    原来如此- -
    那在这里,我在哪里添加Hide比较好呢?
    因为直接点击TreeView的话就不会在原来的Form里触发Hide了吧
      

  21.   

    其实有个很好用的属性,Tag object的
    你可以先判断
    var form = e.Node.Tag as Form;
    if(form != null) 
    {
        form.Show();
        return;
    }
    swtich(e.Node.Name)
    {
       ...里面都用form就行了,反正都有break,没有贯穿的case
    }
    e.Node.Tag=form;
    form.Show();
    关闭的时候用form.Hide()  不要close
      

  22.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
      

  23.   

    写个bool类型的值,只要new了一次就让它变true,开始时是false,你在new前判断就bool是不是true如果是就跳过了,这样就不会重复new一个form了false就会new那个form表示没有new过
      

  24.   


    又被名词给吓助了,该出手时不必犹豫什么细节上的原则,.Net自己的库里还真没少用它
      

  25.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
      

  26.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
    先把你那三个要Show的窗体的父类改成UserConttrol
    然后把直接new 那三个控件并Add到Panel里面。然后点左边的树菜单就 直接 treeView1.BringToFront()就可以了
            UserControl uc1;
            UserControl uc2;
            UserControl uc3;
            private void Form1_Load(object sender, EventArgs e)
            {
                uc1=new UserControl();
                uc1.Dock= DockStyle.Fill;
                uc2=new UserControl();
                uc2.Dock= DockStyle.Fill;
                uc3=new UserControl();
                uc3.Dock= DockStyle.Fill;
                p1.Controls.Add(uc1);
                p1.Controls.Add(uc2);
                p1.Controls.Add(uc3);
            }
        
          
             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        uc1.BringToFront();
                      
                        break;
     
                    case "Node2":
                        uc2.BringToFront();
                      
                        break;
     
                    case "Node3":
                        uc3.BringToFront();
                        break;
                }
            }
      

  27.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
    先把你那三个要Show的窗体的父类改成UserConttrol
    然后把直接new 那三个控件并Add到Panel里面。然后点左边的树菜单就 直接 treeView1.BringToFront()就可以了
            UserControl uc1;
            UserControl uc2;
            UserControl uc3;
            private void Form1_Load(object sender, EventArgs e)
            {
                uc1=new UserControl();
                uc1.Dock= DockStyle.Fill;
                uc2=new UserControl();
                uc2.Dock= DockStyle.Fill;
                uc3=new UserControl();
                uc3.Dock= DockStyle.Fill;
                p1.Controls.Add(uc1);
                p1.Controls.Add(uc2);
                p1.Controls.Add(uc3);
            }
        
          
             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        uc1.BringToFront();
                      
                        break;
     
                    case "Node2":
                        uc2.BringToFront();
                      
                        break;
     
                    case "Node3":
                        uc3.BringToFront();
                        break;
                }
            }

    我新添加了一个用户控件,用这个方法不能把控件在页面上显示出来- -
      

  28.   

    我有个疑问,我是要在3个节点中显示3个不同的Form,但是21的方法好像是只有一个Form的样子
    初学者,说得不对请包涵
      

  29.   

    呃大概的思路我是明白的,只是做了之后没有效果。。
    而且我试了一下,在原先的Form1的Closing过程加弹对话框的代码。
    但实际上根本没有弹对话框,这个就是说在用TreeView切换页面的过程中,Form1其实是没有被关闭的把,只是为什么之后就show不出来呢?
      

  30.   

    呃大概的思路我是明白的,只是做了之后没有效果。。
    而且我试了一下,在原先的Form1的Closing过程加弹对话框的代码。
    但实际上根本没有弹对话框,这个就是说在用TreeView切换页面的过程中,Form1其实是没有被关闭的把,只是为什么之后就show不出来呢?
    那是你没明白我说的UserControl..
      

  31.   

    没事儿,我一向很随和的
    你应该知道,用户不管选择哪一个节点都会触发Select事件,此时这个Node就确定了,只会是其中一种case,要么是Form1,要么是Form2
    最终它只会弹出其中一个Form,并且这几个节点除了弹出form本身不同外,处理上都是一样的,
    像下面这样
    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)        {            
         var form = e.Node.Tag as Form;
         if(form != null) 
         {    
              form.Show();    
              return;
         }
         swtich(e.Node.Name)
         {  
             case "Node1":                    
                  Form1 F1 = new Form1(); 
                  break;  
                   
             case "Node2":  
                  Form2 F2 = new Form2();
                  break;                          case "Node3":
                  Form3 F3 = new Form3();
                  break;            
         }
         form.TopLevel = false;                    
         form.FormBorderStyle = FormBorderStyle.None; 
         form.WindowState = FormWindowState.Maximized;
         panel显示.Controls.Add(form);                    
         form.Show();                          
    }
    一般像你这种情况,多用到工厂模式,这个你可以以后再慢慢了解
      

  32.   

    上面的Form1 F1和Form2 F2这种都换成form
      

  33.   

    呃大概的思路我是明白的,只是做了之后没有效果。。
    而且我试了一下,在原先的Form1的Closing过程加弹对话框的代码。
    但实际上根本没有弹对话框,这个就是说在用TreeView切换页面的过程中,Form1其实是没有被关闭的把,只是为什么之后就show不出来呢?
    那是你没明白我说的UserControl..
    我是新添加了一个用户控件,按照你给的代码改了一下程序,但是在Panel中显示不出来。
    请大哥指导一下
      

  34.   

    我尝试了一下
    但是在Form1里我有个按键是按完后就button1.Enabled = false;的
    用TreeView换切换了一下Form回来,就又可以点击了
    这样的话,切换回来的时候是又new了一个Form吗?
      

  35.   

    在那按键的Click中设置button1.Enabled = false;
    对于Form1那些不要使用Close,使用Hide()就好,否则每次都会去创建新实例
      

  36.   

    其实我最想不懂的就是这里,我并没有用CLOSE关闭页面,我还专门在closing里加了个弹出对话框,打个断点。
    但是切换页面的时候没有进入过断点,这么说应该是没有触发close事件的吧?
      

  37.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
    先把你那三个要Show的窗体的父类改成UserConttrol
    然后把直接new 那三个控件并Add到Panel里面。然后点左边的树菜单就 直接 treeView1.BringToFront()就可以了
            UserControl uc1;
            UserControl uc2;
            UserControl uc3;
            private void Form1_Load(object sender, EventArgs e)
            {
                uc1=new UserControl();
                uc1.Dock= DockStyle.Fill;
                uc2=new UserControl();
                uc2.Dock= DockStyle.Fill;
                uc3=new UserControl();
                uc3.Dock= DockStyle.Fill;
                p1.Controls.Add(uc1);
                p1.Controls.Add(uc2);
                p1.Controls.Add(uc3);
            }
        
          
             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        uc1.BringToFront();
                      
                        break;
     
                    case "Node2":
                        uc2.BringToFront();
                      
                        break;
     
                    case "Node3":
                        uc3.BringToFront();
                        break;
                }
            }
    大哥,我说的之针对他这种情况。更好的方法是考虑设计模式。《大话设计模式》和《C#设计模式中》都用提到。
    对于您提供的这段代码,如果你添加一个case分支,是不是要修改treeView1_AfterSelect函数,这个是不是违反“开放-闭合”原则?
    当然,如果修改的可能性不太大,这样用也挺好的
      

  38.   

    其实,这是个典型的生成器模式,如果是我的话,一个form就够了。
    详见《C#设计模式》james W.Cooper的12章
      

  39.   

    http://download.csdn.net/detail/stallion5632/5532189
    C#设计模式(中英文带目录完整版附源码)
      

  40.   

    谢谢大家的指导,终于解决了,其实楼上的建议都有一些错误。
    直接点TreeView切换是不会关闭Form的,因为Form显示在Panel里,一般是看不见右上的关闭按钮的,我也没写close,所以Form是不会关闭的,这时候只有一个实例。
    第二次要显示Form的时候不是用show,是用BringToFront,应该是Form已经实例化过了,而且show过了,不过在点TreeView切换的时候被放到下面去了,直接用BringToFront拉到最上面就可以了。
      

  41.   


    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
    先把你那三个要Show的窗体的父类改成UserConttrol
    然后把直接new 那三个控件并Add到Panel里面。然后点左边的树菜单就 直接 treeView1.BringToFront()就可以了
            UserControl uc1;
            UserControl uc2;
            UserControl uc3;
            private void Form1_Load(object sender, EventArgs e)
            {
                uc1=new UserControl();
                uc1.Dock= DockStyle.Fill;
                uc2=new UserControl();
                uc2.Dock= DockStyle.Fill;
                uc3=new UserControl();
                uc3.Dock= DockStyle.Fill;
                p1.Controls.Add(uc1);
                p1.Controls.Add(uc2);
                p1.Controls.Add(uc3);
            }
        
          
             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        uc1.BringToFront();
                      
                        break;
     
                    case "Node2":
                        uc2.BringToFront();
                      
                        break;
     
                    case "Node3":
                        uc3.BringToFront();
                        break;
                }
            }
    大哥,我说的之针对他这种情况。更好的方法是考虑设计模式。《大话设计模式》和《C#设计模式中》都用提到。
    对于您提供的这段代码,如果你添加一个case分支,是不是要修改treeView1_AfterSelect函数,这个是不是违反“开放-闭合”原则?
    当然,如果修改的可能性不太大,这样用也挺好的小伙子,你书念多了
    而且念的是国产的那种烂书。建议你看看国外英文版的,或翻译版的也行。国内所谓高手写的那写什么模式还是别看了,那些书都是误人子弟的。
      

  42.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?
      

  43.   

    实际上,如果需要捕获F1的Close状态,比较靠谱的做法是写private Form1 F1;
     
    public Form1 Form1
    {
      get{
         if(F1==null)
         {
                        F1 = new Form1();
                        F1.TopLevel = false;
                        F1.FormBorderStyle = FormBorderStyle.None;
                        F1.WindowState = FormWindowState.Maximized;
                        panel显示.Controls.Add(F1);
                        F1.Closed => (s,e)=> F1=null;
         }
         return F1;
      }   
    }
    也就是说,F1变量引用null,这样更符合技术的“直觉”,不用额外地过度考虑技术。不过,再考虑得更高一点层次我们会发现,那么此时就跟没有必要说什么“只new一次”这种话了。这就是说合作不一致,一旦做了(写代码)就走样了。因此会说,还要谨慎地把代码写对,让我们言行一致。有理。不过想不明白他把窗体Add到Panel里做啥。为何不用UserControl。就不用考虑这个Show与Close了
    直接Visible不是来的更方便么。
    初学者- - ,想做个左边竖条导航的界面,就捣鼓了这个东西出来- -直接用UserControl拉。知道你想做啥。
    大哥,能给个简单的例子吗?
    谢谢啊
    先把你那三个要Show的窗体的父类改成UserConttrol
    然后把直接new 那三个控件并Add到Panel里面。然后点左边的树菜单就 直接 treeView1.BringToFront()就可以了
            UserControl uc1;
            UserControl uc2;
            UserControl uc3;
            private void Form1_Load(object sender, EventArgs e)
            {
                uc1=new UserControl();
                uc1.Dock= DockStyle.Fill;
                uc2=new UserControl();
                uc2.Dock= DockStyle.Fill;
                uc3=new UserControl();
                uc3.Dock= DockStyle.Fill;
                p1.Controls.Add(uc1);
                p1.Controls.Add(uc2);
                p1.Controls.Add(uc3);
            }
        
          
             private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                switch (e.Node.Name)
                {
                    case "Node1":
                        uc1.BringToFront();
                      
                        break;
     
                    case "Node2":
                        uc2.BringToFront();
                      
                        break;
     
                    case "Node3":
                        uc3.BringToFront();
                        break;
                }
            }
    大哥,我说的之针对他这种情况。更好的方法是考虑设计模式。《大话设计模式》和《C#设计模式中》都用提到。
    对于您提供的这段代码,如果你添加一个case分支,是不是要修改treeView1_AfterSelect函数,这个是不是违反“开放-闭合”原则?
    当然,如果修改的可能性不太大,这样用也挺好的小伙子,你书念多了
    而且念的是国产的那种烂书。建议你看看国外英文版的,或翻译版的也行。国内所谓高手写的那写什么模式还是别看了,那些书都是误人子弟的。
    我们编码是不是先自己想想是不是这样设计更好呢 不要唯什么就是好的 没有自己的判断能力
      

  44.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
      

  45.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗
      

  46.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.
      

  47.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!
      

  48.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!那书太高端了对我初学者来说看不懂呀。要不你开个贴子我们讨论讨论。就争对switch的展开。说什么模式都行。就当作学习一下。。OK。
      

  49.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!那书太高端了对我初学者来说看不懂呀。要不你开个贴子我们讨论讨论。就争对switch的展开。说什么模式都行。就当作学习一下。。OK。
    擦,人家书都说完了,还开毛帖子!博客园 找“伍迷”,http://www.cnblogs.com/cj723/category/118146.html作者先写得博客,然后才写得书
    你要是老手,显然你的技术还菜的很,如果是跟我一样的初学者,应该保持平和的态度去学习!我可以引用参考资料,你呢?如果你要反驳我,能否给出具体的理由?一同进步怎么样?
      

  50.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!那书太高端了对我初学者来说看不懂呀。要不你开个贴子我们讨论讨论。就争对switch的展开。说什么模式都行。就当作学习一下。。OK。
    擦,人家书都说完了,还开毛帖子!博客园 找“伍迷”,http://www.cnblogs.com/cj723/category/118146.html作者先写得博客,然后才写得书
    你要是老手,显然你的技术还菜的很,如果是跟我一样的初学者,应该保持平和的态度去学习!我可以引用参考资料,你呢?如果你要反驳我,能否给出具体的理由?一同进步怎么样?不要着急麻。我最近没啥事,所以就找个话题 聊 聊。我的争论点是为什么switch不建议用麻。我就是菜鸟呀,书读的不多请见谅,所以你有什么好的东西 不要保留呀,这样可以多聊解一下,我没有要攻击你的意思
      

  51.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!那书太高端了对我初学者来说看不懂呀。要不你开个贴子我们讨论讨论。就争对switch的展开。说什么模式都行。就当作学习一下。。OK。
    擦,人家书都说完了,还开毛帖子!博客园 找“伍迷”,http://www.cnblogs.com/cj723/category/118146.html作者先写得博客,然后才写得书
    你要是老手,显然你的技术还菜的很,如果是跟我一样的初学者,应该保持平和的态度去学习!我可以引用参考资料,你呢?如果你要反驳我,能否给出具体的理由?一同进步怎么样?不要着急麻。我最近没啥事,所以就找个话题 聊 聊。我的争论点是为什么switch不建议用麻。我就是菜鸟呀,书读的不多请见谅,所以你有什么好的东西 不要保留呀,这样可以多聊解一下,我没有要攻击你的意思
    建议你考虑一下上面qq752923276同学的建议,读一下书再说话。最后再骂你一句:你就是个大煞笔,尼玛的!
      

  52.   


    什么Switch case 违返开发闭合,这不扯蛋么,你的老师是谁。谁教你的。 难道你叫他写n个的if else 
    你的老师误人子弟了,你再把你老师的想法传达给别人,这不误了别人么。
     
    大哥 你看过点设计模式吧?小弟我没看过。
    如果真的没看过 那您先看看再发表你的观点也可以的 对吗我觉的没必要看。它的存在自然有他的道理.《大话设计模式》你看看豆瓣评论再说话。《C#设计模式》是外国人写的啊,2002年出版了,2011年还有出版社再版呢!
    还有此时此刻,你肯定说不出面向对象五大原则,如果你知道,就不会说这样的话了,请你了解以后再说话!那书太高端了对我初学者来说看不懂呀。要不你开个贴子我们讨论讨论。就争对switch的展开。说什么模式都行。就当作学习一下。。OK。
    擦,人家书都说完了,还开毛帖子!博客园 找“伍迷”,http://www.cnblogs.com/cj723/category/118146.html作者先写得博客,然后才写得书
    你要是老手,显然你的技术还菜的很,如果是跟我一样的初学者,应该保持平和的态度去学习!我可以引用参考资料,你呢?如果你要反驳我,能否给出具体的理由?一同进步怎么样?不要着急麻。我最近没啥事,所以就找个话题 聊 聊。我的争论点是为什么switch不建议用麻。我就是菜鸟呀,书读的不多请见谅,所以你有什么好的东西 不要保留呀,这样可以多聊解一下,我没有要攻击你的意思
    建议你考虑一下上面qq752923276同学的建议,读一下书再说话。最后再骂你一句:你就是个大煞笔,尼玛的!生气拉二货。。看你就是死读书的料。不跟你玩了。