在用 VS.NET进行窗体设计的时候,经常会遇到这样的问题:我们需要在构造函数或者在OnLoad事件中进行自己的一些初始化操作,比如连接一个数据库、调用一个资源文件或者后期绑定一个组件。如果代码通过编译,在运行时会执行得相当如你所愿。然而,当我们用窗体设计器打开这样一个窗体或者继承的窗体,IDE环境会抛出非常令人不愉快的异常,比如(NullReferenceException )。
究其原因,主要是窗体设计器在载入窗体时会自动初始化该对象,自动执行诸如构造函数、OnLoad方法和InitializeComponent方法,目的在于能使窗体设计器展现出可视化的编辑操作环境。(一些第三方控件也就是利用这个时机弹出注册认证的)。
现在大家明白了,原来我们通过窗体设计器打开一个窗体类或控件类时,IDE环境已经悄悄地在宿主进程中实例化了我们的类。
如果我们在构造函数中写了这样的代码:
[c-sharp] view plaincopy print?
  1. public class MyClass : System.WIndows.Forms.Form
  2. {
  3. public MyClass(string fileName)
  4. {
  5. InitializeComponent();
  6. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常!
  7. //…
  8. }
  9. //…
  10. }

public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }

问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
一、判断 this.DesignMode 属性
这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J。
 
二、利用 Assembly.GetEntryAssembly()方法
判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
 
三、定义一个静态成员,指示程序所处的模式
此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
[c-sharp] view plaincopy print?
  1. //全局类
  2. public class GlobalClass
  3. {
  4. //私有构造器,防止实例化
  5. private GlobalClass(){}
  6. //用于标识运行时/设计时的bool型静态成员,初始值设为false
  7. public static bool RunTimeMode = false;
  8. }
  9. //包含程序入口的类
  10. Public class Entry
  11. {
  12. //主线程入口点,窗体设计器绝不会执行此方法
  13. static void Main(string[] args)
  14. {
  15. //置为true
  16. GlobalClass.RunTimeMode = true;
  17. //…..
  18. }
  19. //…
  20. }
  21. //某个窗体类
  22. public class MyForm : System.Windows.Forms.Form
  23. {
  24. public MyForm()
  25. {
  26. //窗体设计器必须调用的
  27. InitializeComponent();
  28. //判断运行模式
  29. If( GlobalClass.RunTimeMode )
  30. {
  31. //在此处做一些窗体设计器会报错的事情
  32. }
  33. //…
  34. }
  35. //…
  36. }

//全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。

如果大家有什么更好的办法解决所述问题,记得分享哦 :)

转载自:http://blog.csdn.net/uyi/archive/2006/03/18/628694.aspx

print?

  1. public class MyClass : System.WIndows.Forms.Form
  2. {
  3. public MyClass(string fileName)
  4. {
  5. InitializeComponent();
  6. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常!
  7. //…
  8. }
  9. //…
  10. }

public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }

问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
一、判断 this.DesignMode 属性
这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J。
 
二、利用 Assembly.GetEntryAssembly()方法
判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
 
三、定义一个静态成员,指示程序所处的模式
此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
[c-sharp] view plaincopy print?
  1. //全局类
  2. public class GlobalClass
  3. {
  4. //私有构造器,防止实例化
  5. private GlobalClass(){}
  6. //用于标识运行时/设计时的bool型静态成员,初始值设为false
  7. public static bool RunTimeMode = false;
  8. }
  9. //包含程序入口的类
  10. Public class Entry
  11. {
  12. //主线程入口点,窗体设计器绝不会执行此方法
  13. static void Main(string[] args)
  14. {
  15. //置为true
  16. GlobalClass.RunTimeMode = true;
  17. //…..
  18. }
  19. //…
  20. }
  21. //某个窗体类
  22. public class MyForm : System.Windows.Forms.Form
  23. {
  24. public MyForm()
  25. {
  26. //窗体设计器必须调用的
  27. InitializeComponent();
  28. //判断运行模式
  29. If( GlobalClass.RunTimeMode )
  30. {
  31. //在此处做一些窗体设计器会报错的事情
  32. }
  33. //…
  34. }
  35. //…
  36. }

//全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。

如果大家有什么更好的办法解决所述问题,记得分享哦

print?

  1. public class MyClass : System.WIndows.Forms.Form
  2. {
  3. public MyClass(string fileName)
  4. {
  5. InitializeComponent();
  6. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常!
  7. //…
  8. }
  9. //…
  10. }

public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }

问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
一、判断 this.DesignMode 属性
这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J。
 
二、利用 Assembly.GetEntryAssembly()方法
判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
 
三、定义一个静态成员,指示程序所处的模式
此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
[c-sharp] view plaincopy print?
  1. //全局类
  2. public class GlobalClass
  3. {
  4. //私有构造器,防止实例化
  5. private GlobalClass(){}
  6. //用于标识运行时/设计时的bool型静态成员,初始值设为false
  7. public static bool RunTimeMode = false;
  8. }
  9. //包含程序入口的类
  10. Public class Entry
  11. {
  12. //主线程入口点,窗体设计器绝不会执行此方法
  13. static void Main(string[] args)
  14. {
  15. //置为true
  16. GlobalClass.RunTimeMode = true;
  17. //…..
  18. }
  19. //…
  20. }
  21. //某个窗体类
  22. public class MyForm : System.Windows.Forms.Form
  23. {
  24. public MyForm()
  25. {
  26. //窗体设计器必须调用的
  27. InitializeComponent();
  28. //判断运行模式
  29. If( GlobalClass.RunTimeMode )
  30. {
  31. //在此处做一些窗体设计器会报错的事情
  32. }
  33. //…
  34. }
  35. //…
  36. }

//全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。

如果大家有什么更好的办法解决所述问题,记得分享哦 :)

转载自:http://blog.csdn.net/uyi/archive/2006/03/18/628694.aspx

print?

转载于:https://www.cnblogs.com/lihuali/p/6531679.html

Windows 窗体设计器中的设计时错误相关推荐

  1. 在.NET Core 3.0 Preview上使用Windows窗体设计器

    目录 介绍 软件要求 克服限制 证明问题 解决方案 使用代码 兴趣点 介绍 截至撰写本文时,Microsoft和社区目前正在测试.NET Core 3.0.如果您在.NET Core 3.0的正式可用 ...

  2. [翻译]用于.NET Core的Windows窗体设计器发布

    本文由微信公众号<开发者精选资讯>翻译首发,转载请注明来源 今天我们很高兴地宣布,.NET Core 项目的 Windows 窗体设计器现在可以在 Visual Studio 2019 1 ...

  3. 通过用 .NET 生成自定义窗体设计器来定制应用程序

    本文讨论: ? 设计时环境基本原理 ? 窗体设计器体系结构 ? Visual Studio .NET 中窗体设计器的实现 ? 为自己的应用程序编写窗体设计器而需要实现的服务 在很多年中,MFC 一直是 ...

  4. C#用DesignSurface实现一个简单的窗体设计器

    System.ComponentModel.Design.DesignSurface是为设计组件提供一个用户界面,通过它可以实现一个简单的窗体设计器. 在构建之前,我们需要引入System.Desig ...

  5. 知识管理系统Data Solution研发日记之六 窗体设计器

    知识管理系统Data Solution已经有五篇文章对它进行介绍,可以通过下面的连接,找到前面的文章 知识管理系统Data Solution研发日记之一 场景设计与需求列出 知识管理系统Data So ...

  6. DotNet(C#)自定义运行时窗体设计器 一

    由于项目功能的需要,要做一个运行时的设计器,首先想到的做法就是模仿VS2005的IDE设计器,有设计窗口,有属性格等.刚开始由于没有时间深入探讨,通过监听Windows消息的方法做了一个,效果不是怎么 ...

  7. 演练:在组件设计器中创建 Windows 服务应用程序

    http://msdn.microsoft.com/zh-cn/library/zt39148a(v=vs.80).aspx 演练:在组件设计器中创建 Windows 服务应用程序 .NET Fram ...

  8. 在 Visual Studio 2019 中为 .NET Core WinForm App 启用窗体设计器

    当我们在使用 Visual Studio 2019 非预览版本开发 Windows Forms App (.NET Core) 应用程序时是不能使用窗体设计器的.即使在窗体文件上右击选择"显 ...

  9. C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs

    https://zhidao.baidu.com/question/1513483178103163220.html C# winform程序设计的时候,出现了问题.默认主窗体form1(改名form ...

最新文章

  1. html页面视频标签,html5基础标签(html5视频标签 html5新标签用法)
  2. jbpm4.4基础知识
  3. WinCE文件目录定制及内存调整
  4. DOS 批处理命令学习1
  5. 实录分享 | 计算未来轻沙龙:揭秘AutoML技术(视频 + PPT)
  6. ITK:基本区域增长
  7. 我人傻了,火狐坏了,重启系统删了重下都搞不好那种,点开只有弹窗(已解决)
  8. 30岁的你收入是多少?用数据可视化,看看大家的30岁工资真相
  9. 分页标签commons.tld,NavigationTag,Page
  10. UE4 WebUI 4.26下载
  11. 关于LNK2005的错误
  12. C# MessageQueue例子
  13. 巧用CSS,愚人节极客式恶搞
  14. 记一次搭建 nodebb 论坛
  15. 十一、海思HISI3556V200摄像头功能裁剪
  16. yolov1模型结构和训练测试流程详解
  17. linux 串口 数量限制,linux – 你的Unix的TTY主要数量是多少?
  18. 双亲委派模型和破坏性双亲委派模型详解
  19. python2exe_Python 使用Py2exe进行bin化
  20. iOS - 蓝牙开门智能门锁

热门文章

  1. 围观窗体与组件01 - 零基础入门学习Delphi23
  2. 嵌入式ARM多核处理器并行化方法
  3. 训练MNIST数据集模型
  4. 三大缓存框架ehcache、memcache和redis的介绍
  5. Android中shape的使用
  6. WPF 将Bitmapsource转换到Emgu.cv.image
  7. 电路与电子学-第一章直流电路分析方法小概括
  8. 今天微软的office 2010终于发布了!
  9. 微软为其虚拟机更新Linux支持
  10. ffmpeg-- audio decoder