请教C#中创建新窗体同时销毁掉旧窗体的问题(献上100分)

wen3050 2009-03-18 11:17:41
菜鸟提问
比如说 Program.cs文件中含的是: Application.Run(new form1);
而在 form1 中有按钮可以打开 form2 但是并不能销毁掉from1
又如 form2 中有按钮可以打开 form3 但怎样能销毁掉form1 和form2 ???
再就是 如果有很多 form 而各个窗体又都是不一样的,又该怎样来实现每次打开新的窗体,同时又能销毁掉旧的窗体?
希望代码尽量简单,而且注释尽量详细 谢谢了
(搜索到的答案太让人寒心了...)
...全文
728 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
feifeiwua 2010-03-15
  • 打赏
  • 举报
回复
kankan daan
liu49439 2009-11-12
  • 打赏
  • 举报
回复
我也在想这个问题。怎样才能把主窗体的线程控制交给子窗体呢。。。
wen3050 2009-03-20
  • 打赏
  • 举报
回复
wen3050 2009-03-20
  • 打赏
  • 举报
回复
再次表示感谢
wen3050 2009-03-20
  • 打赏
  • 举报
回复
谢谢13楼的, 我在网上有看到过通过改 Program.cs 来实现的,
想想应该是能通过修改Application.Run()中的参数来实现的,只是自己没实现
倒是觉得有点遗憾而已 不过你的方法以及很不错了
bluegeckoo 2009-03-20
  • 打赏
  • 举报
回复
Windows里面必须维护一个主线程不能结束,不然整个程序就结束运行了,所以你在form1里面显示form2然后又想把form1关掉是不可以的,结果会是整个程序都结束。

至于更复杂的实现方式可以让启动窗体关闭,但那就复杂了.涉及线程调用托管.我只是大概听说过,并且很难做.

比较变通的实现你的要求就是启动窗体为form0,form0启动的同时hide.然后启动form1.但是这样做的话,每个窗体的关闭方法需要加一个公共方法,就是检测如果程序内没有其他打开的窗体就关闭form0.否则线程就死在那里了.


bluegeckoo 2009-03-19
  • 打赏
  • 举报
回复
又发现句错句:"缺点是每个窗体只能启动一次".......我想说的是窗体是单一实例方式,同一时间只能启动一个.

这个原则就是用窗体内的静态变量自己声明自己.启动则一概通过公共函数使用这个自己声明自己的变量.
bluegeckoo 2009-03-19
  • 打赏
  • 举报
回复
刚才有点错误,不小心把我的窗口名字带进去了,修改为如下


建立一个public静态类

建立这个公共方法
public static void FormShow(Form formInstance)
{
if (formInstance == null)
{
return;
}
formInstance.Show();
这里接其他的,如activatem,FormWindowState等.
}
.........................
然后把启动窗体之外的如form2建立一个private static form2 formInstance的私有静态.
以及每个窗体建立启动过程
public static form2 FormInstance
{
get
{
if (formInstance == null || formInstance.IsDisposed)
{
formInstance = new form2();
}
return formInstance;
}
}
其他form34567都一样.一般情况下把这些窗体的构造函数改为private统一启动方式.

启动窗体的方式则为 : 公共类.FormShow(form2.FormInstance);

这样每个窗体的实际类名是保存在自己窗体内的private的,所以除了主窗口外都可以随意关闭而不影响其他窗体.
缺点是每个窗体只能启动一次
bluegeckoo 2009-03-19
  • 打赏
  • 举报
回复
建立一个public静态类

建立这个公共方法
public static void FormShow(Form formInstance)
{
if (formInstance == null)
{
return;
}
formInstance.Show();
这里接其他的,如activatem,FormWindowState等.
}
.........................
然后把启动窗体外的form2建立一个private static form2 formInstance的私有静态.
以及每个窗体建立启动过程
public static fmMotherSearch FormInstance
{
get
{
if (formInstance == null || formInstance.IsDisposed)
{
formInstance = new form2();
}
return formInstance;
}
}
其他form34567都一样.一般情况下把这些窗体的构造函数改为private统一启动方式.

启动窗体的方式则为 : 公共类.FormShow(form2.FormInstance);

这样每个窗体的实际类名是保存在自己窗体内的private的,所以除了主窗口外都可以随意关闭而不影响其他窗体.
缺点是每个窗体只能启动一次
kbtjh 2009-03-19
  • 打赏
  • 举报
回复
帮顶一下
benjaminwu198818 2009-03-19
  • 打赏
  • 举报
回复

  newform.dispose(); //释放资源 
newform =null; //类似于自杀
wen3050 2009-03-19
  • 打赏
  • 举报
回复
高手来帮帮小弟哈
wen3050 2009-03-19
  • 打赏
  • 举报
回复
1楼 你答案太牵强了吧
2楼 谢谢你的支持 我都搜过了
3楼 你没看清我的问题,主窗体并不能销毁掉
4楼 大家一起学习就是哈
5楼 你说的大家都学过
6楼 谢谢帮忙顶哈
7-9楼 嘿嘿 你的答案最靠谱了 不过我想要的是 from1 from2都是可以销毁的
即每次创建新窗体时旧窗体同时销毁掉
阿达King哥 2009-03-18
  • 打赏
  • 举报
回复
原本以为自己什么都懂,上了论坛才发现,原来自己什么都不懂。
亚里士多德说得好:不知道,才是最聪明的。
我说:“原来我听亚里士多德说过后才发现我是这样的笨。”
jackljane 2009-03-18
  • 打赏
  • 举报
回复
把父窗体作为子窗体的一个属性传过去.
然后在子窗体中操作这个属性关掉窗体
深海之蓝 2009-03-18
  • 打赏
  • 举报
回复
以前在csdn上有一个很完整的答案,实在是没找到,楼主再找找,解决方法很好
deqian 2009-03-18
  • 打赏
  • 举报
回复
form2 newfrm = new form2();
newfrm.Show();

第2个
form3 newfrm = new form3();
newfrm.Show();
form1.Hide();
form2.Hide();









企业黄页:http://www.12580520.com or http://www.0663bx.com/yellow
各位觉得好就支持下正版!!! 第一个包的地址http://download.csdn.net/source/1170979 第三个包的地址http://download.csdn.net/source/1170990 《Programming C#(第4版)(文版)》 作者: Jesse Liberty 著 刘基诚,李愈胜,刘卫卫 译 出版: 2007年9月 书号: 978-7-121-04592-9 页数: 666 定价: 78.00元 章节目录 前言 I 第1部 C#语言 1 第1章 C#与.NET框架 3 .NET平台 3 .NET框架 4 编译过程与MSIL 6 C#语言 7 第2章 出发:“Hello World” 9 类、对象与类型 9 开发“Hello World” 16 使用Visual Studio .NET调试器 21 第3章 C#语言基础 24 类型 24 变量与常量 29 表达式 37 空白 37 语句 38 操作符 54 预处理指令 63 第4章 类与对象 67 定义类 68 创建对象 73 使用静态成员 80 销毁对象 85 传递参数 88 重载方法和构造方法 94 用属性封装数据 97 只读字段 101 第5章 继承与多态 104 具体化与一般化 104 继承 107 多态 107 抽象类 115 万类之根:Object 119 类型的装箱和拆箱 121 嵌套类 124 第6章 操作符重载 127 使用operator关键字 127 支持其他.NET语言 128 创建有用的操作符 128 逻辑操作符对 129 等于操作符 129 转换操作符 130 第7章 结构体 136 定义结构体 136 创建结构体 139 第8章 接口 144 实现接口 145 访问接口方法 154 重定义接口的实现 162 显式接口实现 166 第9章 数组、索引器与集合 176 数组 176 foreach语句 181 索引器 197 集合接口 206 约束 210 List 215 队列 226 栈 229 字典 232 第10章 字符串与正则表达式 235 字符串 236 正则表达式 251 第11章 异常处理 263 抛出和捕获异常 264 Exception对象 274 自定义异常 278 重抛出异常 280 第12章 委托与事件 286 委托 287 多重委托 298 事件 302 使用匿名方法 315 从多重委托获取值 316 第2部 C#编程 325 第13章 创建Windows应用程序 327 创建一个简单的Windows窗体 328 创建Windows Forms程序 332 XML文档型注释 357 第14章 用ADO.NET访问数据 360 关系型数据库与SQL 360 ADO.NET对象模型 364 开始使用ADO.NET 366 使用OLE DB托管提供程序 369 使用数据绑定控件 371 第15章 ASP.NET程序与Web Services编程 380 理解网页窗体 381 创建一个网页窗体 385 添加空间 389 数据绑定 391 Web Service 401 SOAP、WSDL和发现 402 创建一个Web Service 403 创建代理 407 第16章 综合运用 414 总体设计 414 建立网络服务客户端 414 显示结果 424 根据类检索 433 第3部 C#与.NET CLR 439 第17章 程序集和版本控制 441 PE文件 441 元数据 441 安全边界 442 清单 442 多模块程序集 443 专用程序集 451 共享程序集 452 第18章 属性和反射 459 属性 459 反射 466 第19章 封送和远程编程 478 程序域 479 上下文 489 远程访问 491 第20章 线程与同步 503 线程 504 同步 513 竞赛状态和死锁 523 第21章 流 525 文件和目录 526 读写数据 537 异步I/O 544 网络I/O 549 网页流 569 序列化 572 独立存储 581 第22章 COM组件在.NET平台上的编程 585 导入ActiveX控件 585 导入COM组件 593 导出.NET组件 602 P/Invoke 604 指针 608 附录 C#关键字 613 索引 619

110,539

社区成员

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

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

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