共用方式為


MFC ActiveX 控制項: 使用 ActiveX 控制項中的資料繫結

ActiveX 控制項的功能更強大的用途是資料繫結,以便在資料庫中的特定欄位繫結控制項的屬性。 當使用者修改此繫結屬性中的資料時,控制項會通知資料庫並要求更新資料錄的欄位。 然後資料庫就會通知控制項是成功或失敗的要求。

本文涵蓋您工作的控制項部分。 實作與資料庫的資料繫結互動是控制項容器的責任。 在容器中您管理資料庫互動的方式並不包含這份文件的範圍。 這份文件的其餘部分會說明如何準備進行資料繫結控制項。

資料繫結控制項的概念圖

資料繫結控制項

COleControl類別會提供兩個成員函式,可讓資料繫結的簡單的程序來實作。 第一個函式中, BoundPropertyRequestEdit,用來要求權限來變更屬性值。 BoundPropertyChanged,第二個函式,會呼叫之後的屬性值已變更成功。

本文涵蓋下列主題:

  • 建立可繫結的內建屬性

  • 建立可繫結的 Get/Set 方法

建立可繫結的內建屬性

雖然很可能您應該就可以建立資料繫結的內建屬性, 可繫結的 get/set 方法。

注意事項注意事項

內建屬性有可繫結requestedit 預設狀況下的屬性。

若要新增一個可繫結的內建屬性,使用加入屬性精靈

  1. 開始專案,使用 MFC ActiveX 控制項精靈

  2. 以滑鼠右鍵按一下控制項的 [介面] 節點。

    如此會開啟快顯功能表。

  3. 從快速鍵功能表中,按一下 [ 新增 ,然後按一下 [ 加入屬性

  4. 選取其中一個項目從屬性名稱下拉式選單。 比方說,您可以選取文字

    因為文字 是一個內建的屬性, 可繫結requestedit 屬性都已檢查過。

  5. 選取下列核取方塊,從的 IDL 屬性 ] 索引標籤: displaybinddefaultbind 若要將屬性加入至專案中的屬性定義。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 方法,您也可以建立可繫結的內建屬性。

注意事項注意事項

這個程序假設您具有 ActiveX 控制 Windows 控制項專案的子類別。

若要加入可繫結的 get/set 方法,使用加入屬性精靈

  1. 載入控制項專案。

  2. 控制設定頁面上,選取所要子類別化控制項的視窗類別。 比方說,您可能要子類別化編輯控制項。

  3. 載入控制項專案。

  4. 以滑鼠右鍵按一下控制項的 [介面] 節點。

    如此會開啟快顯功能表。

  5. 從快速鍵功能表中,按一下 [ 新增 ,然後按一下 [ 加入屬性

  6. 鍵入在 [摘要資訊名稱屬性名稱方塊。 使用MyProp為使本範例。

  7. 選取的資料類型,從屬性型別下拉式清單方塊。 使用為使本範例。

  8. 對於實作類型,按一下 [ Get/Set 方法

  9. 從 [IDL 屬性] 索引標籤中選取下列核取方塊: 可繫結requesteditdisplaybind,以及 defaultbind 若要將屬性加入至專案中的屬性定義。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函式是屬性,也就是參數傳遞給 id () 屬性中的屬性進行的 dispid。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. 若要標頭檔的標頭檔,為您的控制項類別的公用區段中,加入下列定義 (建構函式) 的成員變數:

    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 控制項