小弟最近刚学C#,遇到些问题。我做了两个用户控件,用一个treeview来控制它们,两个控件重叠的放到一个窗口里,要求点击A节点时显示控件A,点击B节点时显示控件B,估计以后还会在这个窗口放更多的控件,下面是我写的一段代码,但是控件总不能置前private void treeParamConfigure_AfterSelect(object sender, TreeViewEventArgs e)
        {
            WebSoftwareControl webSoftwareControl = WebSoftwareControl.GetInstance();
            WebSoftwareDetailControl webSoftwareDetailControl = WebSoftwareDetailControl.GetInstance();
            switch (Convert.ToString(treeParamConfigure.SelectedNode.Text))
            {
                case "项目概况":
                    webSoftwareDetailControl.Visible = false;
                    webSoftwareControl.BringToFront();
                    webSoftwareControl.Visible = true;
                    webSoftwareControl.Show();
                    break;
                case "详细配置":
                    webSoftwareControl.Visible = false;
                    webSoftwareDetailControl.BringToFront();
                    webSoftwareDetailControl.Visible = true;
                    webSoftwareDetailControl.Show();
                    break;
                default:
                    break;            }
我也不知道是什么问题,调试了一下是能通过的,能进到这两个case里来,而且visible的值也是对的,但就是执行的时候不能置前显示
    而且还有个问题是感觉用bringtofront和利用visible也不是最好的,因为我以后还要往这个窗体里加更多的控件,如果这样的话,来一个控件我就要在每一个case里面把其他的visible置为false,这样代码就太臃肿了,容易出错,大家有没有好的办法啊?在此谢过了~~

解决方案 »

  1.   

    可以用TabControl控件来实现,根据点击的结点显示不同的tabpage,这样处理起来会简单很多或者将不同情况显示的控件分别封装到一个自定义控件,根据不同的点击加载某一个自定义控件到界面就可以了。
      

  2.   

    你用的方法没问题,有问题的是你的代码结构。你不可能这样无限制的去添加case语句吧。把你所有的WebSoftwareControl放到HashTable里面。下面算是伪代码:
    -------------------------------------
    //把控件放到一个hashtable里面
    Hashtable table = new Hashtable();
    table.add("项目概况",WebSoftwareControl.GetInstance());
    table.add("详细配置", WebSoftwareDetailControl.GetInstance());
    ... 如果再有其它的同样的table.add去添加。//全部先隐藏
    foreach(WebSoftwareControl control in table.Values)
    {
        control.Visible = false;
    }//显示你TreeView中选中的
    ((WebSoftwareControl)table[treeParamConfigure.SelectedNode.Text]).Visible = true;
    ((WebSoftwareControl)table[treeParamConfigure.SelectedNode.Text]).BringToFront();----------------------------
    这样每次你有新的控件,只需要在Hashtable中去添加,其它代码不用改。
    注意上面的代码我是就在这里敲的,应该不能直接通过编译,你自己回去改一下。
      

  3.   

    呵呵,我再详细描述一下,其实我做的这个软件是个管理软件,网上也是有很多这种类型的嘛,但是质量就很难找到免费的好的了,而且我做的这个业务管理的表较多,近60多个,需要分很多层。我是把先用C1的控件库的narbar做了一个导航菜单,把总的业务分成了5块,有一块属于参数配置,这些参数用treeview自顶向下配置方便点,再把它放到了tabControl,希望就是客户看另一块的时候还能返回到前一块来,因为每个类型的配置的界面都不一样,如果都用tabControl的话那tab就太多了,呵呵,所以我还不如多做几个控件,是吧?
      

  4.   

    其实我就是想到了这点,按我这样做用一个控件不仅置要用的visible为true,还要把其余的都置false,没用过Hashtable,试试,不过你确定我的这段代码没问题吗?我的就是不能让它置前,也不知道为什么,把我给郁闷的
      

  5.   

    用tabControl方便,你用个label或Panel控件将它的所有tab遮起来就好了,外观上就看不出来了.
    这样在代码中直接切换tab方便,每次显示一个tab,对当前的进行操作不影响其它的tab.即使你用Hashtable,还是要做个全部先隐藏,多做了一些无用动作.
      

  6.   

    只能这样么?感觉把tab遮起来有点太...到时候还得交给老大代码的,看起来会不会显得不专业啊
      

  7.   

    把tab遮起来,你以后的新增,删除,维护和管理都方便点,改动的地方少。
    你要觉得不专业就用上面的Hashtable
      

  8.   

    呵呵,谢谢了,已经基本上解决了,我用的是tabControl,也是考虑到以后好维护些,然后让tabVisible = false,这样就看不到了,老大让我们用C1的控件,不过不知道是控件用的不对还是控件自身的原因,把所有的tabVisible置为false后会出错,换句话说tabVisible = true的tab至少有一个,于是我就又加了一个tab,让它的text置空,运行不会出错,唯一的缺憾是tab还是会露出一点点,不过问题不大了
      

  9.   

    呵呵,谢谢了,已经基本上解决了,我用的是tabControl,也是考虑到以后好维护些,然后让tabVisible = false,这样就看不到了,老大让我们用C1的控件,不过不知道是控件用的不对还是控件自身的原因,把所有的tabVisible置为false后会出错,换句话说tabVisible = true的tab至少有一个,于是我就又加了一个tab,让它的text置空,运行不会出错,唯一的缺憾是tab还是会露出一点点,不过问题不大了