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();
}