c#c panel 动态添加控件加载panel 及控件, 要求电脑在线可以远程帮我

5739人阅读
c#.net(30)
&&&&&&&& /// &summary&&&&&&&& /// 调整画面布局&&&&&&& /// &/summary&&&&&&&& /// &param name="videoNum"&&/param&&&&&&&& /// &returns&&/returns&&&&&&&& private bool InitializeVideo(int videoNum)&&&&&&& {&&&&&&&&&&& //计算行列&&&&&&&&&&&&&&&&&&&&&& if (videoNum &= 0 || !int.TryParse(Math.Sqrt(videoNum).ToString(), out rowcol))&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&& //计算宽高&&&&&&&&&&& int WidthHeight = (int)(MainPanel.Width / rowcol);&&&&&&&&&&& &&&&&&&&&&& //重新设置表格&&&&&&&&&&& //MainPanel为TableLayoutPanel控件&&&&&&&&&&& MainPanel.Controls.Clear();&&&&&&&&&&& MainPanel.RowCount = MainPanel.ColumnCount =&&&&&&&&&&& MainPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.S&&&&&&&&&&& MainPanel.Refresh();&&&&&&&&&&& for (int i = 0; i & MainPanel.ColumnStyles.C i++)&&&&&&&&&&& {&&&&&&&&&&&&&&& MainPanel.ColumnStyles[i].SizeType = SizeType.A&&&&&&&&&&&&&&& MainPanel.ColumnStyles[i].Width = WidthH&&&&&&&&&&& }&&&&&&&&&&& for (int i = 0; i & MainPanel.RowStyles.C i++)&&&&&&&&&&& {&&&&&&&&&&&&&&& MainPanel.RowStyles[i].SizeType = SizeType.A&&&&&&&&&&&&&&& MainPanel.RowStyles[i].Height = WidthH&&&&&&&&&&& }&&&&&&&&&&& //添加控件&&&&&&&&&&& for (int i = 0; i & videoN i++)&&&&&&&&&&& {&&&&&&&&&&&&&&& PictureBox pVideo = new PictureBox();&&&&&&&&&&&&&&& pVideo.Padding = pVideo.Margin = new Padding(0);&&&&&&&&&&&&&&& pVideo.Name = "pVideo" + i.ToString();&&&&&&&&&&&&&&& pVideo.Width = pVideo.Height = WidthH&&&&&&&&&&&&&&& pVideo.Dock = DockStyle.F&&&&&&&&&&&&&&& pVideo.BackgroundImage = Resources.&&&&&&&&&&&&&&& pVideo.BackgroundImageLayout = ImageLayout.S&&&&&&&&&&&&&&& pVideo.Click += new EventHandler(pVideo_Click);&&&&&&&&&&&&&&& MainPanel.Controls.Add(pVideo, i % rowcol, i / rowcol);&&&&&&&&&&& }&&&&&&&&&&&&&&&&&& }&&&&&&& /// &summary&&&&&&&& /// 点击图像事件&&&&&&& /// &/summary&&&&&&&& /// &param name="sender"&&/param&&&&&&&& /// &param name="e"&&/param&&&&&&&& private void pVideo_Click(object sender, EventArgs e)&&&&&&& {&&&&&&&&&&& PictureBox pVideo = (PictureBox)&&&&&&&&&&& //MessageBox.Show(pVideo.Name);&&&&&&&&&&& if (MainPanel.GetColumnSpan(pVideo) == 1)&&&&&&&&&&& {&&&&&&&&&&&&&&& //隐藏其它控件&&&&&&&&&&&&&&& foreach (Control ctr in MainPanel.Controls)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& if (ctr.Name != pVideo.Name)&&&&&&&&&&&&&&&&&&&&&&& ctr.Visible =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& pos = MainPanel.GetPositionFromControl(pVideo);&&&&&&&&&&&&&&& MainPanel.SetCellPosition(pVideo, new TableLayoutPanelCellPosition(0, 0));&&&&&&&&&&&&&&& MainPanel.SetRowSpan(pVideo, MainPanel.RowCount);&&&&&&&&&&&&&&& MainPanel.SetColumnSpan(pVideo, MainPanel.ColumnCount);&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& //显示所有控件&&&&&&&&&&&&&&& foreach (Control ctr in MainPanel.Controls)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& ctr.Visible =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& MainPanel.SetCellPosition(pVideo, pos);&&&&&&&&&&&&&&& MainPanel.SetRowSpan(pVideo, 1);&&&&&&&&&&&&&&& MainPanel.SetColumnSpan(pVideo, 1);&&&&&&&&&&& }
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:181403次
积分:2857
积分:2857
排名:第10035名
原创:100篇
转载:16篇
评论:32条
(4)(3)(4)(1)(1)(2)(1)(1)(3)(7)(1)(3)(1)(3)(1)(1)(1)(2)(4)(5)(22)(44)(1)C#中如何动态加载DockPanel
C#中如何动态加载DockPanel
因工作需要,在WinForm项目中要求实现动态加载DockPanel。
简单研究了下,演示代码如下:
DockPanel runPanel = dockManager1.AddPanel(DockingStyle.Left); runPanel.Name = “Dock1”;
DockPanel samePanel = //查找相同位置是否已有停靠插件 foreach (DockPanel hasPanel in dockManager1.Panels) { if (hasPanel.Name != &Dock1& && hasPanel.Dock = = DockingStyle.Left) {
samePanel = hasP } }
if (samePanel != null) {
runPanel.DockAsTab(samePanel); }
runPanel.show();
很简单几行代码,实现了基本意图。看起来问题很快解决。
但是实际应用中发现几个问题:
1、当第一次运行时,dockManager1.AddPanel后dockManager1.Panels.Count值为1;当DockAsTab后,dockManager1.Panels.Count值为3,系统居然自动增加了一个DockPanel。
2、使用DockAsTab方式,新的DockPanel总是在已有DockPanel右边生成,然后再融合进去,用户体验非常差,尤其是主程序中间有Mdi子程序时,总会有屏幕不停闪烁的效果。
这是怎么回事呢?
通过研究DockPanel的相关文档,终于明白DockPanel的运行机制。
在论述下面的一些观点前,先说明笔者使用的是DX11版本带的DockManager和DockPanel控件。
一个典型的DockPanel如下图。它包括DockPanel主体和容器两个部分。DockPanel中要承载其他控件时,控件容器必须建立。
在DX中,实例化一个DockPanel有三个方法。第一种方法示例如下:
DockPanel runPanel = new DockPanel();
该方法有两点需要注意:
?&&&&&&&&它不会自动建立控件容器,需要使用者手工添加,代码示例如下:
ControlContainer _dockPanelContainer =newDevExpress.XtraBars.Docking.ControlContainer()
_dockPanelContainer.Name= &dockPanel_Container&;
runPanel.Controls.Add(_dockPanelContainer);
//添加控件
runPanel.ControlContainer.Add(newControl());
?&&&&&&&&它需要手工注册到DockManager中去
runPanel.Register(dockManager1);
第二种方法是常用的方法,示例如下:
DockPanel runPanel = dockManager1.AddPanel(DockStyle.Left);
它会自动注册DockPanel到DockManager,同时添加一个ControlContainer。
第三种方法示例如下:
DockPanel runPanel = sameDockPanel.AddPanel();
它由一个已存在的DockPanel创建一个新的DockPanel。
该新DockPanel的ParentPanel不是创建者,而是由系统自己建立的一个PanelContainer,该PanelContainer同时被设置为RootPanel。
DockPanel有两种停靠模式,Split和Tab模式。
Split模式界面示例如下图,两个DockPanel根据实际停靠风格并立在一起。
默认情况下,当我们建立好两个DockPanel,将它们直接show出来,它们呈现的就是如下图的Split模式。
Tab模式如下图,两个DockPanel是以分页样式融合在一起。示例代码如下:
using DevExpress.XtraBars.D // ...
//创建一个左停靠控件 DockPanel panel1 = dockManager1.AddPanel(DockingStyle.Left); panel1.Text = &runDockPanel1&; //由panel1添加一个停靠控件; //如果直接把panel1和panel2都show出来,我们可以看到它们是Split模式 DockPanel panel2 = panel1.AddPanel(); panel2.Text = & runDockPanel2&; //将二者的共同父容器设置为Tab模式 DockPanel container = panel1.ParentP container.Tabbed =
最后演示效果图如下:
在这里需要明确的是:
当某个位置(如左边)只有一个DockPanel时,该DockPanel的ParentPanel和RootPanel都是自己。当存在两个及以上DockPanel时,所有DockPanel的ParentPanel和RootPanel都是由系统生成的一个公共DockPanelContainer作为父容器,该容器容纳所有同位置的DockPanel。
在关闭同位置的DockPanel时,若只剩下一个DockPanel,则DockPanelContainer会被系统自动释放。
明白了上面的这些原理,对解决上面提出的两个问题就找到了答案。
第一个问题如上所述,当同一位置存在两个或两个以上的DockPanel时,系统自动生成一个容器来容纳。
第二个问题,当在使用DockAsTab前,两个DockPanel是Split模式,之后才变为Tab模式。解决方法就是使用已存在的DockPanel建立新的DockPanel,然后把二者的ParentPanel设置为Tab模式。
另外在这里提一下,DockPanel中默认只能放置UserControl,如果使用Form类型,需要把TopLevel设置下,但是放置在DockPanel中的Form太有个性了。
一个典型的Tab模式DockPanel如上图。
最后,贴出部分实际代码供大家参考:
/// &summary&
/// 建立停靠控件t
/// &/summary&
/// &param name=&sCaption&&标题&/param&
/// &param name=&sName&&名称&/param&
/// &param name=&ctl&&控件实例&/param&
/// &param name=&dock&&停靠位置?&/param&
/// &param name=&dockManager&&停靠管理器&/param&
/// &param name=&IsNew&&是否多次新建窗口&/param&
/// &returns&停靠对象&/returns&
[DisplayName(&建立停靠控件&)]
public static DockPanel CreateCtl(string sCaption, string sName, Control ctl, enum_DockLocation dock,
 DockManager dockManager, bool IsNew = false)
DockManager runDockManager = dockM
DockPanel newDockPanel =
//查找当前列表中是否已有同名的dockpanel
DockPanel oldPaneled =
runDockManager.BeginUpdate();
//如果是多次新建窗口,则不查找已有Dock
if (!IsNew)
oldPaneled = GetHaveDockPanel(runDockManager, sName);
if (oldPaneled == null)
DockingStyle dockStyle = DockingStyle.F
switch (dock)
case enum_DockLocation.Left:
dockStyle = DockingStyle.L
case enum_DockLocation.Buttom:
dockStyle = DockingStyle.B
case enum_DockLocation.Right:
dockStyle = DockingStyle.R
case enum_DockLocation.Center:
dockStyle = DockingStyle.F
DockPanel samePaneled = GetSameDockPanel(runDockManager, dockStyle, sName);
if (samePaneled != null)
newDockPanel = samePaneled.AddPanel();
newDockPanel.Dock = DockingStyle.F
newDockPanel = runDockManager.AddPanel(dockStyle);
if (newDockPanel != null)
newDockPanel.ID = new System.Guid();
newDockPanel.Name = sN
newDockPanel.Text = sC
//newDockPanel.Options.ShowAutoHideButton =
if (ctl is Form)
Form srcForm = ctl as F
ctl = ControlLoader.CopyForm2Control(srcForm);
ctl.Dock = DockStyle.F
ctl.Visible =
newDockPanel.Width = ctl.W
newDockPanel.Height = ctl.H
newDockPanel.Controls.Add(ctl);
//浮动停靠窗体处理
if (newDockPanel.Dock.Equals(DockingStyle.Float))
newDockPanel.FloatForm.Size = ctl.S
newDockPanel.FloatForm.StartPosition = FormStartPosition.CenterS
newDockPanel.FloatForm.AutoSizeMode = AutoSizeMode.GrowO
newDockPanel.FloatForm.AutoSize =
newDockPanel.ClosingPanel += new DockPanelCancelEventHandler(ClosingPanel);
newDockPanel.ClosedPanel += new DockPanelEventHandler(ClosedPanel);
newDockPanel = sameP
//在DockManager中注册当前插件
newDockPanel.Register(runDockManager);
if (newDockPanel.ParentPanel != null)
newDockPanel.ParentPanel.Tabbed =
newDockPanel.Visibility = DockVisibility.V
newDockPanel.Visible =
runDockManager.EndUpdate();
return newDockP
catch (Exception ex)
caCom.XLogErr(ex.Message);
部分图片截取自DX网站,若有侵权,概不负责。
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊[size=13px]在菜单点击一个菜单项,弹出一个form,我想实现这个form中的空间全部加载到一个panel中;
控件我加载进去了,可是form及里面的控件对应的事件我没加载进去,请问要如何处理?
for&(int&i&=&r&-&1;&i&&=&0;&i--)
&&&&&&panelContainer.Controls.Add(m_FormEditFeature.Controls[i]);&&&&&//(frm.Handle)
controls[i]对应的事件如何加载到&panelContainer&中。[/size]
回复讨论(解决方案)
没明白你的需求,如果你的控件生成的时候就绑定了时间,不管你加到哪里去,只要没释放,事件就会一直是有效的。
弹出的Form继承你放菜单的这个form
完全没看懂你这是要闹哪样
既然已经做好了form,为什么要把里面控件都扣出来重新放到panel里,这有什么意义吗
给你2个思路
1.不要用form,用用户控件,然后把用户控件直接add进panel里
2.把form作为MDI子窗体嵌入panel里
//记录添加到panel&中的&form.
private&static&List&Form&&frmList&=&new&List&Form&();
&&&&&&&&///&&summary&
&&&&&&&&///&在容器中显示窗体
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name=&parent&&父容器&/param&
&&&&&&&&///&&param&name=&form&&窗体名称&/param&
&&&&&&&&///&&param&name=&pos&&窗体初始位置&/param&
&&&&&&&&///&&param&name=&state&&窗体显示模式&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&public&static&bool&CreateFormClass(Panel&parent,&Form&form,&FormStartPosition&pos,&FormWindowState&state)
&&&&&&&&&&&&try
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(parent&!=&null)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(frmList&!=&null)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&while&(frmList.Count&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&frmList[0].Close();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&frmList[0].Dispose();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&frmList.Remove(frmList[0]);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&if&(parent.HasChildren)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&parent.Controls.Clear();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&form.TopLevel&=&
&&&&&&&&&&&&&&&&&&&&form.Parent&=&
&&&&&&&&&&&&&&&&&&&&form.WindowState&=&
&&&&&&&&&&&&&&&&&&&&form.StartPosition&=&
&&&&&&&&&&&&&&&&&&&&form.Show();
&&&&&&&&&&&&&&&&&&&&frmList.Add(form);
&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&form.Parent&=&
&&&&&&&&&&&&&&&&&&&&form.TopLevel&=&
&&&&&&&&&&&&&&&&&&&&switch&(state)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&case&FormWindowState.Maximized:
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&form.MaximumSize&=&new&Size(Screen.PrimaryScreen.WorkingArea.Width,&Screen.PrimaryScreen.WorkingArea.Height);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&form.WindowState&=&FormWindowState.M
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&form.WindowState&=&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&form.StartPosition&=&
&&&&&&&&&&&&&&&&&&&&form.ShowDialog();
&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&catch&(Exception&ex)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}
我这里每次new&新form&时,&&都将之前的释放了.
可以将窗体显示在容器中,&也可以以指定方式的显示..
楼主可以修改下试试.
form&也是一个容器,&&你直接将form&整体的加入到panel&里面就好了&&
form&也是一个容器,&&你直接将form&整体的加入到panel&里面就好了&&
如何将form整体的加入到panel里面
我也想这样
可是不知道如何实现,谢谢
form&也是一个容器,&&你直接将form&整体的加入到panel&里面就好了&&
如何将form整体的加入到panel里面
我也想这样
可是不知道如何实现,谢谢
首先,要嵌入的窗体必须设置MDIContainer为true
然后,new&form的时候
Form2&fm=new&Form2();
fm.MDIParent=
panel1.Controls.Add(fm);
fm.Show();
或者你像我上面讲的,不要使用form,改为用户控件,这样添加的时候会少许多麻烦
或者你像我上面讲的,不要使用form,改为用户控件,这样添加的时候会少许多麻烦
您说的对,直接改为用户控件,可以实现;这样在主窗口会多很多代码。
我还有很多工具条,如果都放在主窗口
代码太多。
在说明下前提
我是做ArcGIS&engine+C#开发的
开始都是用command或itool做的
但是Command、Itool中的form不能在主窗口中停靠
所以在主窗口中动态panel,然后把form的控件加载到panel中
可以实现在主窗口的停靠。
或者你像我上面讲的,不要使用form,改为用户控件,这样添加的时候会少许多麻烦
您说的对,直接改为用户控件,可以实现;这样在主窗口会多很多代码。
我还有很多工具条,如果都放在主窗口
代码太多。
代码只会减少,怎么可能会多.其实就跟你放到form里是一样的,既然控件放到form里,代码也写到form里
改成用户控件,你也把代码写在用户控件里啊
这样起码你主窗体不需要设置为MDI容器,也不需要设置子窗体的parent
现在问题是,不是用户控件
主窗口的panel可以停靠
如果直接在主窗口中加,代码会增加很多
UIPanel&panel&=&new&UIPanel();
&&&&&&&&&&&&&&&&panel.Size&=&new&System.Drawing.Size(m_FormEditFeature.Width&+&10,&m_FormEditFeature.Height);
&&&&&&&&&&&&&&&&panel.Name&=&m_FormEditFeature.N
&&&&&&&&&&&&&&&&panel.Text&=&m_FormEditFeature.T
&&&&&&&&&&&&&&&&panel.DockStyle&=&PanelDockStyle.R
&&&&&&&&&&&&&&&&panel.DockState&=&PanelDockState.D
&&&&&&&&&&&&&&&&//对象初始化
&&&&&&&&&&&&&&&&((ponentModel.ISupportInitialize)(panel)).BeginInit();
&&&&&&&&&&&&&&&&panel.Id&=&Guid.NewGuid();
&&&&&&&&&&&&&&&&//临时挂起控件的布局逻辑
&&&&&&&&&&&&&&&&panel.SuspendLayout();
&&&&&&&&&&&&&&&&m_UIPanelManager.Panels.Add(panel);
&&&&&&&&&&&&&&&&UIPanelInnerContainer&panelContainer&=&new&UIPanelInnerContainer();
&&&&&&&&&&&&&&&&panel.InnerContainer&=&panelC
&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&//插件必须保证ChildHWND正确,否则会发生异常
&&&&&&&&&&&&&&&&&&&&int&r&=&m_FormEditFeature.Controls.C
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&r&-&1;&i&&=&0;&i--)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&panelContainer.Controls.Add(m_FormEditFeature.Controls[i]);&&&&&//(frm.Handle)
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&panelContainer.Dock&=&DockStyle.F
&&&&&&&&&&&&&&&&&&&&panelContainer.Location&=&new&System.Drawing.Point(5,&30);
&&&&&&&&&&&&&&&&&&&&panelContainer.Name&=&m_FormEditFeature.Name&+&&Container&;
&&&&&&&&&&&&&&&&&&&&panelContainer.Size&=&new&System.Drawing.Size(panel.Width&-&10,&panel.Height&-&30);
&&&&&&&&&&&&&&&&&&&&panelContainer.TabIndex&=&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&catch&(Exception&ex)
&&&&&&&&&&&&&&&&{&MessageBox.Show(ex.Message,&&异常提示!&);&}
&&&&&&&&&&&&&&&&((ponentModel.ISupportInitialize)(panel)).EndInit();
&&&&&&&&&&&&&&&&m_FormEditFeature.FormIdentify_Load();
我在7楼已经给了你代码了
我在7楼已经给了你代码了
首先感谢您。
我详细看了你的回复,反复测试,您说的是对的。
可以接着问下你么?
下面有空白
这个如何处理,我实验的好几种都没实现,您要是知道请告知我。
右侧如果只有两个panel,可以放个SplitContainer,Dock属性设置成Fill
如果有多个panel,可以SplitContainer里再嵌套SplitContainer,或者根据窗体高度动态修改每个panel的大小
位置不用管,只要把属性都设置成top,它自己就会跟着走了
或者上面的设置成top,最下面的设置成fill
非常感谢,我刚调整,设置好了。}

我要回帖

更多关于 c panel 动态添加控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信