运行时错误:Error: no data exchange control with ID 0xXXXX

运行时错误:Error: no data exchange control with ID 0xXXXX

作者:BlogUpdater |  时间:2019-03-12 |  浏览:4528 |  评论已关闭 条评论

有时候会碰到一些奇怪的运行时问题,如标题所示。
当我们在VS中拖了一个控件到对话框模板上,我们通常会将这个控件绑定到一个变量上。例如,我们会将一个CButton绑定到一个按钮,将CEdit绑定到一个编辑框。如果没有给予特别的注意,就会出现如下的错误:
Error: no data exchange control with ID 0xXXXX

并且,这个错误仅在Debug版本出现,而且它还是隐藏在MFC的调试输出中。如果你直接跑一个有问题的程序,你仅仅会看到一个通用的,平淡无奇的断言失败错误,进而整个应用程序走向生命的终点。
下面介绍可能的原因:

资源ID重复
随着工程的规模越来越大,我们使用的控件也会随之增加,如果不小心,将一个控件的资源ID和另一个控件的ID重复了,那么在DDX_Control阶段就会让MFC框架犯难了:为什么这个ID标识的是一个按钮,你却要绑定到一个CEdit变量上。
原因就在于,这个ID不仅是按钮的ID,也同时是编辑框的ID。通常,这个错误很容易找到,直接打开resource.h,查看那些控件共用相同的ID即可。以下是代码片段:
#define IDC_BUTTON1 122
#define IDC_EDIT1 122

不在控件所在的父窗口执行DDX_Control
这个原因比较少见,也比较隐秘。有时候代码写太多,一下子脑袋犯迷糊就会犯这样的错误。需要牢记:一般DDX_Control需要在控件的父窗口执行,否则也会出现如上的错误。

总结
1) 保持控件的ID唯一
2) 检查DDX_Control是否出现在正确的父窗口代码中。

标签:

评论已关闭。