我要在窗口的外部关闭它,不知如何做好?
再找个窗口的内部关闭它很容易,直接 this.close()就行了,但是,在窗口外部,如何通过代码关闭它呢?
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.TopLevel = false;
frm.Parent = panel1;
frm.Show();
}
以上代码就是我将一个窗口加载到 panel 控件中的代码,
我有可能随时将不同的窗体,加载到 panel中,所以要关闭已经打开的窗体。
30 个解决方案
#1
如果panel1只有一个窗体那就 ((Form)panel1.Controls[0]).Close();
#2
做个标记,明天来看看,正好需要
#3
如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?
如何检测容器中,是否有加载的窗体呢?
#4
((Form)(panel1.Controls[0])).Close();这样写看看!
#5
可能是你加载进去的不是控件,所以应该关闭他的子窗口!
#6
我就是这样写的呀,关键是,我如何检测panel中是否已经加载了窗体了?
#7
foreach (Control con in this.panel1.Controls)
{
if (con is Form2)
{
Form2 t = con as Form2;
t.Close();
}
}
虽然这样可以。但是应该有更好的办法。
#8
panel1.Controls.Clear();
#9
//加个判断就可以
if(panel1.Controls.Count>0)
{
((Form)panel1.Controls[0]).Close();
}
#10
if (panel1.Controls.Count>0)
{
//判断是否加载有子控件。
}
#11
这样符合你逻辑需求部?
private Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.TopLevel = false;
f2.Parent = panel1;
f2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
f2.Close();
}
private Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.TopLevel = false;
f2.Parent = panel1;
f2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
f2.Close();
}
#12
上面很多办法了也
奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...
奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...
#13
panel1.Controls.Remove(frm)
#14
窗体左边的是导航条,根据导航的不同,在右边加载不同的窗体到 panel 控件。
所以,panel 中加载的窗体的关闭,要通过左边的导航条进行控制。
#15
就是类似这种界面的效果。
#16
这应该是往Panel里放个自定义控件,应该不是Form。
#17
1.关闭panel里的控件 有现成的方法
2.form声明成类内 方法外变量
2.form声明成类内 方法外变量
#18
找个地方保存当前的form,关闭后form置null,每次关闭判断form是否为null。
#19
不好意思,我想关注这贴子,顶一下。
#20
判定Panel内的窗体对象存在与否再决定是否关闭。
#21
标注关注
#22
关注下
#23
我也认为form应该作为一个成员,常驻
而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。
如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整
而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。
如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整
#24
最好的方法是放UserControl,然后删除时用Remove.
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口
#25
自定义控件,而不是form
#26
使用对象之前都先判断对象存不存在是个好习惯来着啊
#27
上面不是5楼的不是可以实现了吗? 楼主
#28
关注下,回去再看了解。
#29
#30
主窗体类中创建UserControl全局变量
public static UserControl currentForm = new UserControl(); //全局变量,用于保存当前的视图
在视图调取按钮事件上:
//若不存在则创建窗体
if (currentForm.Name != "FormName") // FormName为要加载的自定义控件的名称
{
if (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0); //移除原有视图。此次可根据需要发挥。
}
currentForm = new FormMainDate();
currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Controls.Add(currentForm);
currentForm.Show();
}
public static UserControl currentForm = new UserControl(); //全局变量,用于保存当前的视图
在视图调取按钮事件上:
//若不存在则创建窗体
if (currentForm.Name != "FormName") // FormName为要加载的自定义控件的名称
{
if (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0); //移除原有视图。此次可根据需要发挥。
}
currentForm = new FormMainDate();
currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Controls.Add(currentForm);
currentForm.Show();
}
#1
如果panel1只有一个窗体那就 ((Form)panel1.Controls[0]).Close();
#2
做个标记,明天来看看,正好需要
#3
如果已经关闭了,我再次关闭一次,就会报错,如何解决这个问题呢?
如何检测容器中,是否有加载的窗体呢?
如何检测容器中,是否有加载的窗体呢?
#4
((Form)(panel1.Controls[0])).Close();这样写看看!
#5
可能是你加载进去的不是控件,所以应该关闭他的子窗口!
#6
我就是这样写的呀,关键是,我如何检测panel中是否已经加载了窗体了?
#7
foreach (Control con in this.panel1.Controls)
{
if (con is Form2)
{
Form2 t = con as Form2;
t.Close();
}
}
虽然这样可以。但是应该有更好的办法。
#8
panel1.Controls.Clear();
#9
//加个判断就可以
if(panel1.Controls.Count>0)
{
((Form)panel1.Controls[0]).Close();
}
#10
if (panel1.Controls.Count>0)
{
//判断是否加载有子控件。
}
#11
这样符合你逻辑需求部?
private Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.TopLevel = false;
f2.Parent = panel1;
f2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
f2.Close();
}
private Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
f2 = new Form2();
f2.TopLevel = false;
f2.Parent = panel1;
f2.Show();
}
private void button2_Click(object sender, EventArgs e)
{
f2.Close();
}
#12
上面很多办法了也
奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...
奇怪,我想问楼主,为什么不直接在窗体里面手动点击那个右上角的关闭按钮呢?
非要弄个按钮来用代码关闭啊...
#13
panel1.Controls.Remove(frm)
#14
窗体左边的是导航条,根据导航的不同,在右边加载不同的窗体到 panel 控件。
所以,panel 中加载的窗体的关闭,要通过左边的导航条进行控制。
#15
就是类似这种界面的效果。
#16
这应该是往Panel里放个自定义控件,应该不是Form。
#17
1.关闭panel里的控件 有现成的方法
2.form声明成类内 方法外变量
2.form声明成类内 方法外变量
#18
找个地方保存当前的form,关闭后form置null,每次关闭判断form是否为null。
#19
不好意思,我想关注这贴子,顶一下。
#20
判定Panel内的窗体对象存在与否再决定是否关闭。
#21
标注关注
#22
关注下
#23
我也认为form应该作为一个成员,常驻
而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。
如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整
而且也不一定要关闭啊,可能hide()还更好,这样不用每次都重新加载。
如果form太多的话,要权衡一下了,吃内存。要设计优先关闭的,可以按打开时间顺序来调整
#24
最好的方法是放UserControl,然后删除时用Remove.
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口
放FORM再关掉的话,要在Panel里声明一个变量,用来保存当前的窗口,如果会加载多个窗口那就用List<Form>,从外部关闭窗口后,清空变量或从List<Form>中移附对就的窗口
#25
自定义控件,而不是form
#26
使用对象之前都先判断对象存不存在是个好习惯来着啊
#27
上面不是5楼的不是可以实现了吗? 楼主
#28
关注下,回去再看了解。
#29
#30
主窗体类中创建UserControl全局变量
public static UserControl currentForm = new UserControl(); //全局变量,用于保存当前的视图
在视图调取按钮事件上:
//若不存在则创建窗体
if (currentForm.Name != "FormName") // FormName为要加载的自定义控件的名称
{
if (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0); //移除原有视图。此次可根据需要发挥。
}
currentForm = new FormMainDate();
currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Controls.Add(currentForm);
currentForm.Show();
}
public static UserControl currentForm = new UserControl(); //全局变量,用于保存当前的视图
在视图调取按钮事件上:
//若不存在则创建窗体
if (currentForm.Name != "FormName") // FormName为要加载的自定义控件的名称
{
if (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0); //移除原有视图。此次可根据需要发挥。
}
currentForm = new FormMainDate();
currentForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Controls.Add(currentForm);
currentForm.Show();
}