
在开发Winform程序的时候,我们经常需要根据需要做一些自定义的控制模块,这样可以复用系统模块或者实现更好的效果等功能。但是在使用的时候,我们经常会在设计时发现一些莫名其妙的错误,那么我们应该如何开发和调试控件设计时,以及如何解决设计时出现的错误呢?本文主要介绍自己在这方面积累的一些经验和处理方法,希望对大家有所帮助。
DevExpress Universal Subscription 官方最新版免费下载试用、历史版下载、在线文档和帮助文件下载-huidu.com
1. 自定义控件的设计错误
比如我的通用附件模块中,有一个自定义控件需要提供给外部使用,如下图。
这里外部使用的模块是工作流中的模块和自定义控件。我想用它作为进程信息的显示控件。
因此,我想把这个附件管理的自定义控件拖到另一个自定义控件进程信息显示控件上。设计的流程信息管理界面如下。这个时候,使用这个附近的控件是没有问题的。移动到另一个控件。
编译整个项目,左侧VS工具箱中会出现一个ApplyControl的自定义控件,但是当我将控件拖到新的表单界面时,出现错误。
这个问题可能是因为调用了访问数据库的操作mfc小游戏程序基于对话框,但是我们看不到更详细的位置(数据被截断显示)。
2. Visual Studio 基于控件的调试
为了更好的跟踪错误发生在哪里,我们可以使用VS自带的调试操作来跟踪。
首先,我们在工程的【属性】-》【调试】中将启动操作设置为指定的VS,选择“启动外部程序”作为对应版本VS的IDE程序,如下图。
开始调试后,打开对应的工程,然后再次模拟从工具箱中拖动控件的效果,这样VS IDE就可以定位到具体的位置了。
我们发现VS定位在一个绑定数据的数据库访问操作中,但是我一开始没看懂,这个BindData操作其实并不是通过指定设计时间(!this.DesignMode)来进行的,不知道为什么继续。
public void BindData()
{
ClearData();
if (!this.DesignMode)
{
List fileList = new List();
if (!string.IsNullOrEmpty(this.AttachmentGUID))
{
fileList = BLLFactory.Instance.GetByAttachGUID(this.AttachmentGUID, this.pager1.PagerInfo);
}
else
{
fileList = BLLFactory.Instance.GetAllByUser(this.UserId, this.AttachmentDirectory, this.pager1.PagerInfo);
}
..........................
3. DesignMode 重载,问题解决
调试到这个DesignMode的时候发现它的值是false,那么肯定是从数据库中获取的mfc小游戏程序基于对话框,而设计在找数据的时候,这个时候就出错了。至于为什么DesignMode是假的,一开始我有点困惑。好的设计时刻不是真的吗?
通过搜索,发现一位亲爱的朋友总结的比较淋漓尽致,所以在这里借用一下。
也就是说,一个控件的DesignMode只有在拖到设计器本身时才为真。如果它包含在其他控件中并添加到设计器中,则该控件处于设计模式,但不是!也就是说,DesignMode并不能反映当前环境是否为runtime,它只能告诉你控件当前是否被设计者直接操作(嵌套的不算在内)。”
那么解决方案应该是什么?其实很简单,只需将DesignMode属性改写为我们期望的值即可,如下图。
///
/// 标题:获取一个值,用以指示 System.ComponentModel.Component 当前是否处于设计模式。
/// 描述:DesignMode 在 Visual Studio 产品中存在 Bug ,使用下面的方式可以解决这个问题。///
protected new bool DesignMode
{
get
{
bool returnFlag = false;
#if DEBUG
if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
{
returnFlag = true;
}
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper().Equals("DEVENV"))
{
returnFlag = true;
}
#endif
return returnFlag;
}
}
重新编译控件,然后测试拖动,运行正常,没有报错,大功告成!
开发快递
DevExpress Universal 于 10 月正式发布了今年的第二个主要版本——v21.2。该版本官方宣布支持Visual Studio 2022 & .NET6,完美兼容微软最新的Windows 11。一个用例问题。与时俱进,永不止步!
请登录后发表评论
注册
社交帐号登录