panel控件中加载多个窗体,如何判断,不存在就实例化,存在就显示已有的窗体呢?

tmp_gogoto 2011-08-30 12:03:00
panel控件中加载多个窗体,如何判断,不存在就实例化,存在就显示已有的窗体呢?
-------------------------------------
我通过一个 treeview 显示菜单,用户选择一个菜单后,就调用相应的窗体。
我把不同的窗体,全部加载到一个panel控件中,
但是,我如何判断某个窗体,已经加载了呢?
总不能,每次都 new Form()吧。
我想,如果实例化了,就直接显示窗体,否则就实例化窗体。

请大家给我思路,难在这里了,谢谢。
...全文
131 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
给你几个思路,遍历panel中的contrls,判断类型是不是窗体,查找是否有你需要的窗体,有就show,没有就new。
第二,每个窗体都初始化的时候都加上tag属性,里面存放你觉得合适的窗体特征。遍历conteols,判断tag。
shaofei830927 2011-08-30
  • 打赏
  • 举报
回复
方法1 加属性 保存已经实例化的窗体 属性为null就new一个 不为null就直接show
方法2 窗体单例 注意单例后 窗体close了 就回不来了 只要show 和 hide 就行
白鸽 2011-08-30
  • 打赏
  • 举报
回复
每个窗体下都定义一个变量之类的!每次点击树节点时,给相应的窗体中的变量赋值,并且窗体在每次激活或者加载时,判断变量的值,比如true false。如果为true显示,false隐藏
  • 打赏
  • 举报
回复
Application.OpenForms
这个比panel好用多了
csproj 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xomix 的回复:]

问题是我刚才测试了一下你的说法,form是无法添加到panel里面的,你要添加的到底是啥?
[/Quote]

把窗体的TopLevel 设为 false就可以添加了,
添加之后还是要调用show方法才会显示
  • 打赏
  • 举报
回复

foreach (Control ctl in panel1.Controls)
{
if (ctl.GetType() == this.GetType())
{
if ((Form)ctl.Tag.ToString() == "Form2")
{
ctl.Show();
return;
}
}
}
Form2 fm2 = new Form2();
fm2.Tag = "Form2";
panel1.Controls.Add(fm2);
fm2.Show();


我测试是没法通过的,因为panel里面不能添加顶级控件。
一个用户只能连续回复三次你妹哦
tmp_gogoto 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shaofei830927 的回复:]

方法2 窗体单例 注意单例后 窗体close了 就回不来了 只要show 和 hide 就行
[/Quote]
什么意思,请指教,为何回不来了。
  • 打赏
  • 举报
回复

foreach (Control ctl in panel1.Controls)
{
if (ctl.GetType() == this.GetType())
{
if ((Form)ctl == new Form2())
{
ctl.Show();
return;
}
}
}
Form2 fm2 = new Form2();
panel1.Controls.Add(fm2);
fm2.Show();

第一种方案,可能失败。
  • 打赏
  • 举报
回复
问题是我刚才测试了一下你的说法,form是无法添加到panel里面的,你要添加的到底是啥?
Panel控件的使用 我们对控件进行分组的原因不外乎三个: 1、为了获得清晰的用户界面而将相关的窗体元素进行可视化分组。 2、编程分组,如对单选按钮进行分组。 3、为了在设计时将多个控件作为一个单元来移动。 在vb.net,有GroupBox、Panel、TabControl这三个控件可以实现上面所提到的三个分组目的,所以我们称它们为分组控件。 前面我们了解了GroupBox(控件组)控件(vb.net入门——分组控件:GroupBox控件的使用)的使用,这里我们将来看看下怎么使用Panel(也称面板)控件。实际上,Panel很类似于GroupBox,其区别是:只有GroupBox控件可以显示标题,而只有Panel控件可以有滚动条。 Panel控件在工具箱的图标如图所示:。 一、Panel控件的常用属性 1、Anchor和Dock:这两个属性是所有有用户界面的控件都有的定位属性。 2、Name属性:标识控件的对象名称 3、BorderStyle属性:指示Panel控件的边框样式,共有三个枚举值: BorderStyle.None(默认)—无边框。 BorderStyle.Fixed3D—三维边框 BorderStyle.FixedSingle—单行边框 此外还可以通过BackColor、BackgroundImage属性来改变Panel控件的外观。 4、Font和ForeColor属性,用于改变Panel控件内部文字的大小与文字的颜色,需要注意的时候,这里改变的是其内部控件显示的Text属性的文字外观。 5、AutoScroll属性:该属性指示当控件超出Panel显示的区域时,是否自动出现滚动条,默认为False。 二、创建一组控件 1、在窗体上放置Panel控件。从工具箱拖放一个Panel控件窗体上的合适位置,调整大小。 2、因为Panel控件没有Text属性来标记自己,所以我们一般可以在它的上面添加一个Label控件来标记它。 3、在Panel控件内拖放其它需要的控件,例如RadioButton控件。 4、设置Panel控件的外观属性。 4、设置示例 在窗体上设置两个Panel控件,分别用2个Label控件来标记它们,每个Panel控件放置所需的RadioButton控件。如图一所示: 注意:两个Panel控件的AutoScroll属性都设置为True了。 5、我们在拖动单个Panel控件的时候,它内部的控件也会随着移动,以保持和Panel的相对位置不变。同理,删除Panel控件时,它所包含的所有控件也会被删除掉。 6、当我们调整Panel控件所包含的控件的Anchor和Dock属性的时候,其参照物将不是Form窗体,而是Panel控件了。 7、当AutoScroll 属性为 True 的时候,在设计界面我们也可以拉动出现的滚动条。 三、编程添加Panel控件以及它所包含的控件 动态添加控件一般需要经过下面三个步骤: 1、创建要添加的控件实例 2、设置新控件的属性。 3、将控件添加到父控件的 Controls 集合

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧