MFC ActiveX 控件:在 ActiveX 控件中使用数据绑定

之一对 Activex 控件的更强大的用途是数据绑定,数据库中允许控件属性绑定与特定字段。当用户修改此属性绑定的数据时,控件通知该数据库并请求该记录字段更新。该数据库然后通知成功的请求的控件或系统崩溃。

本文包含您的任务的控件方面。实现与数据库中的数据绑定交互是控件容器的责任。您管理在容器的数据库交互超出了本文档的范围。如何准备数据绑定的控件在其余部分介绍本文。

一个数据绑定控件的概念关系图

数据绑定控件

COleControl 类提供对绑定简单的数据处理实现的两个成员函数。第一个函数, BoundPropertyRequestEdit,用于请求权限更改属性值。,在成功更改后,BoundPropertyChanged,第二个函数,调用属性值。

本文包含以下主题:

  • 创建一个可绑定的常用属性

  • 创建一个可绑定的 get/set 方法

创建一个可绑定的常用属性

创建数据常用属性是可能的,不过,更加可能希望 可绑定的 get/set 方法。

说明说明

默认情况下常用属性具有 bindablerequestedit 属性。

使用 " 添加属性向导 ",添加一个可绑定的常用属性

  1. 使用 MFC Activex 控件向导,启动项目。

  2. 右击控件的接口节点。

    这将打开快捷菜单。

  3. 从快捷菜单上,单击 添加 然后单击 添加属性

  4. 选择一项从 属性名称 下拉列表。例如,您可以选择 文本

    由于 文本 是一个常用属性, bindablerequestedit 属性已检查。

  5. 选中以下复选框。 IDL Attributes 选项:将属性的 displaybinddefaultbind 到 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 方法

  1. 加载您的控件的项目中。

  2. 控件设置 页上,为控件选择窗口类的子类。例如,您可能希望到子类编辑控件。

  3. 加载您的控件的项目中。

  4. 右击控件的接口节点。

    这将打开快捷菜单。

  5. 从快捷菜单上,单击 添加 然后单击 添加属性

  6. 键入在 属性名 框中的属性名称。在本示例中使用 MyProp 。

  7. 选择一个数据类型从的 属性类型 下拉列表框。在本示例中使用 不足

  8. Implementation Type,单击 Get/Set Methods

  9. 选中以下复选框从 IDL 特性选项: bindablerequestedit、添加属性的 displaybinddefaultbind 到 project 中的 .IDL 文件的属性定义。这些属性使控件向用户显示并将该常用属性默认值可绑定属性。

  10. 单击**“完成”**。

  11. 修改 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();
    }
    
  12. 该参数传递给 BoundPropertyChanged 和 BoundPropertyRequestEdit 功能是属性的 dispid,为参数传递给特性的 ID () 属性中 .IDL 文件。

  13. 修改 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;
    
  14. 修改 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);
    }
    
  15. 为头文件的 public 节您的控件类的头文件,添加以下定义 (构造函数) 成员变量的:

    CString m_strText;
    short m_nMyNum;
    
  16. 进行以下行。 DoPropExchange 的最后一行函数:

    PX_String(pPX, _T("MyProp"), m_strText);
    
  17. 修改 OnResetState 功能,以便它包含以下代码:

        COleControl::OnResetState();  // Resets defaults found in DoPropExchange
       m_strText = AmbientDisplayName();
    
  18. 修改 GetMyProp 功能,以便它包含以下代码:

    if(AmbientUserMode())
    {
       GetWindowText(m_strText);
       m_nMyNum = (short)_ttoi(m_strText);
    }
    return m_nMyNum;
    

现在可以生成项目,将注册控件。在插入控件在对话框中 数据字段数据源 属性添加了,并且可以在控件中选中数据源和字段显示。

请参见

参考

数据绑定控件(ADO 和 RDO)

概念

MFC ActiveX 控件