当前位置: 首页 > 工具软件 > Tab Accordian > 使用案例 >

C# Devexpress动态加载Panel, 同方向停靠以TAB方式加载

夏锐藻
2023-12-01

Devexpress动态加载Panel办法,请看我其它的文章,本文仅介绍以TAB方式加载的办法及遇到的问题

我们计划把加载Panel时,检查一下当前是否有同样停靠方式的Panel,如果没有,直接加一个Panel,若有,以TAB的方式停靠在原有的Panel上

1. 检查同方向Panel

           // 查找该DockingStyle是否有Panel
            DockPanel sameDockPanel = null;
            foreach (DockPanel hasPanel in dockManager1.Panels)
            {
                if (hasPanel.Dock == panelDockStyle) sameDockPanel = hasPanel;
            }

2. 若没有,直接增加Panel

            DockPanel newPanel = null;
            if (sameDockPanel == null)
            {
                newPanel = dockManager1.AddPanel(panelDockStyle);
                
            }

3. 若有,其实有一个简单的方法可供调用DockAsTab()


newPanel.DockAsTab(sameDockPanel);

 用这种方式的确在己有的Panel上增加了一个以TAB方式停靠的Panel

       这样的方式新增的Panel, 在拖拽布局时,有的Panel在新的位置就不能再拖了,若是以Tab的方式叠加的布局都没有问题,而单个Panel有的有问题,有的没问题

     后来发现,用DockAsTab方式建立的Panel,因为是共用原有Panel的容器,当拖到新的位置后,就必定有一个Panel没有容器,所以产生了如上的问题,因此,以Tab的方式增加Panel应该用如下的方法

                newPanel = new DockPanel();
                ControlContainer panelContain = new 
                      DevExpress.XtraBars.Docking.ControlContainer();
                newPanel.Controls.Add(panelContain);
                newPanel.Register(dockManager1);
                newPanel.DockAsTab(sameDockPanel);

    以下是一个完整可用的代码:

 /// <summary>
        /// 显示带窗体的Panle, 用来将窗体放在Panel上,以实现动态布局
        /// 参数1:Panel的标题, 参数2:窗体停靠位置, 参数3:装到Panel的窗体
        /// </summary>
        /// <param name="panelTxt"></param>
        /// <param name="panelDockStyle"></param>
        /// <param name="panelForm"></param>
        private void showPanel(String panelTxt, DevExpress.XtraBars.Docking.DockingStyle  panelDockStyle, Form panelForm)
        {
            tabbedView1.BeginUpdate();

            // 查找该DockingStyle是否有Panel
            DockPanel sameDockPanel = null;
            foreach (DockPanel hasPanel in dockManager1.Panels)
            {
                if (hasPanel.Dock == panelDockStyle) sameDockPanel = hasPanel;
            }

           
            DockPanel newPanel = null;
            if (sameDockPanel == null)
            {
                newPanel = dockManager1.AddPanel(panelDockStyle);
                
            } else
            {
                // 因一个DocasTab方法使两个Panel共用一个器,当拖动Tab到一个独立区的时候,
                // 就没有相应的容器了,表现出来的就是拖到独立区域的时候,就不能再次拖动了,
                // 为此,增加为TAB的时候,就需要按如下步骤进行:
                // 1.建Panel, 2. 建容器  3. 将Panel放入容器  4. 再将容器注册到DockManager 
                // 最后用DockAsTab把新建的Panel加到同样停靠方式的Panel上

                newPanel = new DockPanel();
                ControlContainer panelContain = new DevExpress.XtraBars.Docking.ControlContainer();
                newPanel.Controls.Add(panelContain);
                newPanel.Register(dockManager1);
                newPanel.DockAsTab(sameDockPanel);
              
            }
            
            newPanel.Text = panelTxt;
            newPanel.AutoScroll = false;
            newPanel.Dock = DockingStyle.Fill;
            

           
            Form pForm = panelForm;

            // 将窗体的顶级属性设为假,若无此设置,直接加载窗体会报错:无法将顶级控件加载到控件
            pForm.TopLevel = false;
            pForm.FormBorderStyle = FormBorderStyle.None;
            newPanel.Controls.Add(pForm);
            pForm.Dock = DockStyle.None;
            pForm.AutoScroll = true;
            pForm.Dock = DockStyle.Fill;
            pForm.Show();

            tabbedView1.EndUpdate();
        }

 

 类似资料: