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 控件