MFC ActiveX 控件:在 ActiveX 控件中使用数据绑定
之一对 Activex 控件的更强大的用途是数据绑定,数据库中允许控件属性绑定与特定字段。 当用户修改此属性绑定的数据时,控件通知该数据库并请求该记录字段更新。 该数据库然后通知成功的请求的控件或系统崩溃。
本文包含您的任务的控件方面。 实现与数据库中的数据绑定交互是控件容器的责任。 您管理在容器的数据库交互超出了本文档的范围。 如何准备数据绑定的控件在其余部分介绍本文。
一个数据绑定控件的概念关系图
COleControl 类提供对绑定简单的数据处理实现的两个成员函数。 第一个函数, BoundPropertyRequestEdit,用于请求权限更改属性值。 ,在成功更改后,BoundPropertyChanged,第二个函数,调用属性值。
本文包含以下主题:
创建一个可绑定的常用属性
创建一个可绑定的 get/set 方法
创建一个可绑定的常用属性
创建数据常用属性是可能的,不过,更加可能希望 可绑定的 get/set 方法。
备注
默认情况下常用属性具有 bindable 和 requestedit 属性。
使用 " 添加属性向导 ",添加一个可绑定的常用属性
使用 MFC Activex 控件向导,启动项目。
右击控件的接口节点。
这将打开快捷菜单。
从快捷菜单上,单击 添加 然后单击 添加属性。
选择一项从 属性的名称 下拉列表。 例如,您可以选择 文本。
由于 文本 是一个常用属性, bindable 和 requestedit 属性已检查。
选中以下复选框。 IDL Attributes 选项:将属性的 displaybind 和 defaultbind 到 project 中的 .IDL 文件的属性定义。 这些属性使控件向用户显示并将该常用属性默认值可绑定属性。
此时,您的控件可以显示来自数据源的数据,但是,用户便无法更新数据字段。 如果希望控件还可以更新数据,请将 OnOcmCommandOnOcmCommand 功能如下所示:
#ifdef _WIN32
WORD wNotifyCode = HIWORD(wParam);
#else
WORD wNotifyCode = HIWORD(lParam);
#endif
if(wNotifyCode==EN_CHANGE)
{
if(!BoundPropertyRequestEdit(DISPID_TEXT))
{
SetNotSupported();
}
else
{
GetText();
// Notify container of change
BoundPropertyChanged(DISPID_TEXT);
}
}
return 0;
现在可以生成项目,将注册控件。 在插入控件在对话框中 数据字段 和 数据源 属性添加了,并且可以在控件中选中数据源和字段显示。
创建一个可绑定的 get/set 方法
除了一个数据的 get/set 方法外,还可以创建 可绑定常用属性。
备注
此过程假定您具有的子类 windows 控件的 Activex 控件项目。
使用 " 添加属性向导 ",若要将某的 get/set 方法
加载您的控件的项目中。
在 控件设置 页上,为控件选择窗口类的子类。 例如,您可能希望到子类编辑控件。
加载您的控件的项目中。
右击控件的接口节点。
这将打开快捷菜单。
从快捷菜单上,单击 添加 然后单击 添加属性。
键入在 属性名 框中的属性名称。 在本示例中使用 MyProp 。
选择一个数据类型从的 属性类型 下拉列表框。 在本示例中使用 不足 。
为 Implementation Type,单击 Get/Set Methods。
选中以下复选框从 IDL 特性选项: bindable、 requestedit、添加属性的 displaybind和 defaultbind 到 project 中的 .IDL 文件的属性定义。 这些属性使控件向用户显示并将该常用属性默认值可绑定属性。
单击**“完成”**。
修改 SetMyProp 函数的主体,以便包含以下代码:
if(!BoundPropertyRequestEdit(1)) { SetNotSupported(); return; } else { if(AmbientUserMode()) // SendMessage only at run-time { _stprintf_s(m_strText.GetBuffer(10), 10, _T("%d"), newVal); SetWindowText(m_strText); m_strText.ReleaseBuffer(); } else { InvalidateControl(); } // Signal a property change // This is the MFC equivalent of OnChanged() BoundPropertyChanged(1); SetModifiedFlag(); }
该参数传递给 BoundPropertyChanged 和 BoundPropertyRequestEdit 功能是属性的 dispid,为参数传递给特性的 ID () 属性中 .IDL 文件。
修改 OnOcmCommand 功能,因此它包含以下代码:
#ifdef _WIN32 WORD wNotifyCode = HIWORD(wParam); #else WORD wNotifyCode = HIWORD(lParam); #endif if(wNotifyCode==EN_CHANGE) { if(!BoundPropertyRequestEdit(DISPID_TEXT)) { SetNotSupported(); } else { GetText(); // Notify container of change BoundPropertyChanged(DISPID_TEXT); } } return 0;
修改 OnDraw 功能,以便它包含以下代码:
if(!AmbientUserMode()) { // Draw the Text property at design-time pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->DrawText(m_strText, -1, (LPRECT)&rcBounds, DT_LEFT | DT_TOP | DT_SINGLELINE); } else { DoSuperclassPaint(pdc, rcBounds); }
为头文件的 public 节您的控件类的头文件,添加以下定义 (构造函数) 成员变量的:
CString m_strText; short m_nMyNum;
进行以下行。 DoPropExchange 的最后一行函数:
PX_String(pPX, _T("MyProp"), m_strText);
修改 OnResetState 功能,以便它包含以下代码:
COleControl::OnResetState(); // Resets defaults found in DoPropExchange m_strText = AmbientDisplayName();
修改 GetMyProp 功能,以便它包含以下代码:
if(AmbientUserMode()) { GetWindowText(m_strText); m_nMyNum = (short)_ttoi(m_strText); } return m_nMyNum;
现在可以生成项目,将注册控件。 在插入控件在对话框中 数据字段 和 数据源 属性添加了,并且可以在控件中选中数据源和字段显示。