您的位置:首页 > 其它

WinForm设计时异常】关于VS.NET中窗体设计器初始化控件引发的设计时异常

2011-08-23 11:05 316 查看
 
在用 VS.NET进行窗体设计的时候,经常会遇到这样的问题:我们需要在构造函数或者在OnLoad事件中进行自己的一些初始化操作,比如连接一个数据库、调用一个资源文件或者后期绑定一个组件。如果代码通过编译,在运行时会执行得相当如你所愿。然而,当我们用窗体设计器打开这样一个窗体或者继承的窗体,IDE环境会抛出非常令人不愉快的异常,比如(NullReferenceException
)。


究其原因,主要是窗体设计器在载入窗体时会自动初始化该对象,自动执行诸如构造函数、OnLoad方法和InitializeComponent方法,目的在于能使窗体设计器展现出可视化的编辑操作环境。(一些第三方控件也就是利用这个时机弹出注册认证的)。
现在大家明白了,原来我们通过窗体设计器打开一个窗体类或控件类时,IDE环境已经悄悄地在宿主进程中实例化了我们的类。
如果我们在构造函数中写了这样的代码:

view plaincopy to clipboardprint?

public class MyClass : System.WIndows.Forms.Form 


public MyClass(string fileName) 

{  
InitializeComponent(); 
FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! 

//… 
         } 
 
         //… 


view plaincopy to clipboardprint?

//全局类 
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 ) 
                   { 
                            //在此处做一些窗体设计器会报错的事情 

                   } 
                   //… 
         } 
         //… 
} 

//全局类
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 )
{
//在此处做一些窗体设计器会报错的事情
}
//…
}
//…
}
呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。

如果大家有什么更好的办法解决所述问题,记得分享哦 :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐