WinForm中设计时与DesignMode的区别
来源:互联网 发布:hypervisor软件 编辑:程序博客网 时间:2024/05/01 10:42
在开发WinForm系统中,我们经常需要得知当前是设计时还是运行时。举个例子,假定我们设计了一个用户控件,其中包含一个TreeView,我们希望在这个控件被装载的时候就自动把一些数据填充到这棵树里面。如:
如果我们的 SystemData 是在系统启动时被初始化或装载,那么在运行时,这一切都是正常的,但是在设计时,如果我们把这个控件拖拽到某个窗体,很有可能会得到一个"对象为空或未初始化"的错误,从而无法创建该控件的实例。其关键就在于在设计时,我们的 SystemData 对象未初始化。因为设计时VS.NET并不会运行你的系统,它只会把当前控件,及其所有父类都初始化一遍,一般包括其构造函数,OnLoad(),OnInit()等方法(如果你的用户控件无法创建,从这些方法里找找原因)。
其实在运行时,我们根本不需要往这棵树填充任何数据!我们把代码稍微改一下:
OK,问题解决。WinForm里每个Control对象都有 DesignMode 属性,可以判断是否是在设计时。
但 DesignMode 真的能判断当前是否是设计时吗??我们来做个小实验,先写一个测试控件:
然后我们把这个控件编译拖拽到另外一个 UserControl : TestContainerA
这个时候 TestControl.DesignMode 是 True
我们再把这个 TestContainerA 编译拖拽到一个新的用户控件或窗体里: TestContainerB
这个时候弹出来的 TestControl.DesignMode 却是 False !!
真是个神奇的现象。。也就是说一个控件只有在它自己被拖拽到设计器的时候,其 DesignMode 才是真,如果它被包含在其他控件中被加入 到设计器,那么那个控件才是在设计模式,而它不是!换句话说,DesignMode 并不能反映当前环境是否是运行时,它只能告诉你,这个控件当前是不是直接被设计器操作(嵌套的已经不算了)
花了一个多小时才跟踪发现这个错误...设计时控件的无法创建错误真是不好调试
Thanks to jonnyyu,这个解释比较容易理解和正确的:
winform的Design环境是由控件的容器维护的。当控件嵌套在一个没有design环境的容器空间中时其实就是运行时状态。
BTW: 如果大家有别的方法可以判断设计时和运行时,请告知。
protected override void OnLoad() {
// FillTreeView()方法填充树结构, SystemData.GetCatelog() 获得数据
FillTreeView( myTree, SystemData.GetCatelog("产品目录") );
}
// FillTreeView()方法填充树结构, SystemData.GetCatelog() 获得数据
FillTreeView( myTree, SystemData.GetCatelog("产品目录") );
}
如果我们的 SystemData 是在系统启动时被初始化或装载,那么在运行时,这一切都是正常的,但是在设计时,如果我们把这个控件拖拽到某个窗体,很有可能会得到一个"对象为空或未初始化"的错误,从而无法创建该控件的实例。其关键就在于在设计时,我们的 SystemData 对象未初始化。因为设计时VS.NET并不会运行你的系统,它只会把当前控件,及其所有父类都初始化一遍,一般包括其构造函数,OnLoad(),OnInit()等方法(如果你的用户控件无法创建,从这些方法里找找原因)。
其实在运行时,我们根本不需要往这棵树填充任何数据!我们把代码稍微改一下:
if ( this.DesignMode == false ) {
FillTreeView( myTree, SystemData.GetCatelog("产品目录") );
}
FillTreeView( myTree, SystemData.GetCatelog("产品目录") );
}
OK,问题解决。WinForm里每个Control对象都有 DesignMode 属性,可以判断是否是在设计时。
但 DesignMode 真的能判断当前是否是设计时吗??我们来做个小实验,先写一个测试控件:
public class TestControl : System.Windows.Forms.UserControl {
public TestControl() {
System.Windows.Forms.MessageBox.Show( this.DesignMode.ToString() );
}
}
public TestControl() {
System.Windows.Forms.MessageBox.Show( this.DesignMode.ToString() );
}
}
然后我们把这个控件编译拖拽到另外一个 UserControl : TestContainerA
这个时候 TestControl.DesignMode 是 True
我们再把这个 TestContainerA 编译拖拽到一个新的用户控件或窗体里: TestContainerB
这个时候弹出来的 TestControl.DesignMode 却是 False !!
真是个神奇的现象。。也就是说一个控件只有在它自己被拖拽到设计器的时候,其 DesignMode 才是真,如果它被包含在其他控件中被加入 到设计器,那么那个控件才是在设计模式,而它不是!换句话说,DesignMode 并不能反映当前环境是否是运行时,它只能告诉你,这个控件当前是不是直接被设计器操作(嵌套的已经不算了)
花了一个多小时才跟踪发现这个错误...设计时控件的无法创建错误真是不好调试
Thanks to jonnyyu,这个解释比较容易理解和正确的:
winform的Design环境是由控件的容器维护的。当控件嵌套在一个没有design环境的容器空间中时其实就是运行时状态。
BTW: 如果大家有别的方法可以判断设计时和运行时,请告知。
- WinForm中设计时与DesignMode的区别
- DesignMode设计时
- WinForm设计时异常】关于VS.NET中窗体设计器初始化控件引发的设计时异常
- css+div设计时IE与Firefox的主要区别
- css+div设计时IE与Firefox的主要区别
- 【Visual Studio风格开发系列 - WinForm设计时异常】关于VS.NET中窗体设计器初始化控件引发的设计时异常
- winform多个panel在设计时编辑的问题
- 网站中专题设计时的考虑
- .Net 用户控件中复杂属性的设计时支持
- WinCE中的Winform窗体在设计时出现的怪问题
- 【WinForm窗体控件开发】之三续 窗体控件设计时的事件属性
- 组件的设计时属性
- 产品设计时的经验教训
- Winform设计时,怎样给DataGridView加合计行!!!
- 基本概念的澄清 1。抽象类与接口在设计时各有什么好处? 2。静态方法与实例方法的区别(论坛帖抽取)
- 添加简单的设计时支持
- activereport设计时绑定数据库的方法
- 控制自定义控件设计时的表现
- XMLHttpRequst对象的使用
- ERP需求分析方法
- Office Operation
- Pattern Modifiers - 规则表达式的修饰符
- [转]FOR命令中有一些变量以及他们的用法
- WinForm中设计时与DesignMode的区别
- 加班mm一样可以“睡”出美丽肌肤
- 回复[ php有哪些好的书啊]
- 如何判断一个整数是不是一个大整数的因子
- 什么是CentOS
- dynamic_cast详解
- 异形对话框代码整理
- C#编程 忘记密码功能的实现方法
- java.lang.String的split()方法