如何关闭这样形式的所有子窗体

feels30000 2002-04-28 10:54:45
例如主页面上有这样的一个BUTTON
button_click
{
Form1 MyForm=new Form1();//Form1是子窗体
}
程序里允许用户不停的点击BUTTON,这样会产生无数的FORM1窗体,
我可不可以在主窗体上有一个按钮,一次性将所有的子窗体关闭
...全文
141 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yang_Wenli 2002-04-28
  • 打赏
  • 举报
回复
你只能改写你的Form1加入一个链表纪录所有被他打开的Form然后,在关闭任何一个Form时(可以在Closing中写),先关闭被他打开的所有Form。
feels30000 2002-04-28
  • 打赏
  • 举报
回复
你这样只能关闭最后一个打开的窗体,不能关闭全部,所有其他窗体的HANDLE都丢失了,这样的方式是控制不了的
Happyboy_zjy 2002-04-28
  • 打赏
  • 举报
回复
MyForm.Close() or

this.Hidden()
feels30000 2002-04-28
  • 打赏
  • 举报
回复
各位,等待中
feels30000 2002-04-28
  • 打赏
  • 举报
回复
qiujoe(迷糊) 谢谢,马上给分
qiujoe 2002-04-28
  • 打赏
  • 举报
回复
<设计模式>中的观察者模式

feels30000 2002-04-28
  • 打赏
  • 举报
回复
Yang_Wenli(Yang_Wenli),即使是委托(是不是类似函数指针),在主程序里也是需要知道对象的方法,
我想达到的目的是,主程序并不去知道那些被创建的对象的方法,就象是将军要兵去攻占山头和过海打美国,他并不想知道兵是用飞机去打山头还是用坦克去打美国,而是发出打某某的命令,兵自己就决定用什么去打,
不知道意思表达清楚了吗,不过分马上就给了
Yang_Wenli 2002-04-28
  • 打赏
  • 举报
回复
试试使用委托,建立一个委托(CallBack),然后再分别实现方法,最后在各个对象里调用委托实现方法,这样,各个对象不需要知道太多细节,所有方法都在一处维护。
feels30000 2002-04-28
  • 打赏
  • 举报
回复
能不能在具体点讲,我不是很明白,或者推荐一篇文章
qiujoe 2002-04-28
  • 打赏
  • 举报
回复
看了之后一定会明白
qiujoe 2002-04-28
  • 打赏
  • 举报
回复
use observer modern
feels30000 2002-04-28
  • 打赏
  • 举报
回复
Michael_Jackson(麦克尔★杰克逊) ,你的代码我已经收到,我觉得我给的分太少了,应该再多给你们一点分,非常感谢
其实我想更深的讨论这个问题,不仅是要单单的关闭这些对象,就是用户在主界面或者是其他的界面上创建了多个对象实例,(比如保险公司同时做N个投保业务),又可能要同时改变所有这些对象的某些属性或别的,如果让主程序去控制的话,可能这些业务对象的封装没有那么好,而且主程序知道对象的太多细节,能不能通过类似消息一样的东西,只要主程序发出这样的一个消息,这些对象就知道要做怎样的操作
一点点想法,希望大家指导
Michael_Jackson 2002-04-28
  • 打赏
  • 举报
回复
说清楚些好吗? 具体想要主窗体做什么?

是不想打开多个实例??
feels30000 2002-04-28
  • 打赏
  • 举报
回复
当然我可以用一个数组或链表去维护这些窗体,这样就和一般的关闭窗体的方式基本一样了,因为主程序确切的得到了所有窗体的HANDLE,在项目里可能出现多次创建对象的情况,如果我们都要去确切的维护所有的被随机创建的对象会比较费劲,有没有象消息一样的东西,在随机创建的对象得到这样的一个消息后可以自身作出动作,而不需要主程序去干涉,这当然只是我的一个想法,
比如一种方式:设置一个STATIC变量,相当于全局变量的作用,主程序只要通过改变STATIC变量的值,所有随机创建的对象定期检查这样的变量作出相应的反映.
那么有没有更好的方式不让对象主动的去检查这个变量而是被动的接到这样一个命令.
这只是我的一点想法,不知可不可以实现
Michael_Jackson 2002-04-28
  • 打赏
  • 举报
回复
给你代码! 给分吧! :)

ArrayList al = new ArrayList();
/// <summary>
/// 建立窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCreateWindows_Click(object sender, System.EventArgs e)
{
Form2 frm2 = new Form2();
frm2.Show();
al.Add(frm2.Handle);
}

/// <summary>
/// 关闭所有窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCloseAllWindow_Click(object sender, System.EventArgs e)
{
foreach(IntPtr a in al)
{
Form.FromHandle(a).Dispose();
}
}
qiujoe 2002-04-28
  • 打赏
  • 举报
回复
1。在你的窗体中加入对象集合,用来保存打开的窗体
2。加入关闭对象集合中每一个窗体的方法
3。然后你的窗体从这个窗体继承,那么你所有的窗体都 有这个功能了
qiujoe 2002-04-28
  • 打赏
  • 举报
回复
试试Yang_Wenli(Yang_Wenli) 的方法
是可行的
feels30000 2002-04-28
  • 打赏
  • 举报
回复
DBXP() ,我想是不对的,这些我都试过了,而且我定义的MyForm也不是主窗体,这些窗体都分别占有不同的存储空间,其实我们可以变相的把他看成内存泄漏
DBXP 2002-04-28
  • 打赏
  • 举报
回复
happyboy_zjy(阳光男孩) 的答案是正确的。
你只要把以下这段代码放到主窗体中就可以了。因为你关闭了主窗体,你的那些附属于主窗体的子窗体 也就会关闭了。
MyForm.Close()
feels30000 2002-04-28
  • 打赏
  • 举报
回复
qiujoe(迷糊) ,再给个答案就给分了,在线等待
加载更多回复(2)

110,535

社区成员

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

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

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