共用方式為


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

其中一個 ActiveX 控制項更強大的用途是資料繫結,讓控制項屬性繫結至資料庫中的特定欄位。 當使用者修改這個繫結資料時,控制項通知資料庫並要求記錄欄位更新。 資料庫會通知要求成功的控制項或失敗。

本文將工作的控制項。 實作與資料庫中的資料繫結互動是控制項容器的責任。 如何處理在容器的資料庫互動超出這個文件的範圍之外。 如何準備資料繫結的控制項在其他說明本文。

資料繫結控制項的概念圖

資料繫結控制項的概念圖

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

本章節涵蓋下列主題:

  • 建立 Bindable 內建屬性。

  • 建立 Bindable Get/Set 方法

建立 Bindable 內建屬性。

建立資料繫結共用屬性,但是,雖然較可能會想要 繫結 get/set 方法。

注意事項注意事項

預設為內建屬性有 bindablerequestedit 屬性。

使用加入屬性精靈,將可繫結的內建屬性。

  1. 使用 MFC ActiveX 控制項精靈,啟動專案。

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

    這會開啟捷徑功能表。

  3. 從捷徑功能表中,按一下 [加入],再按一下 [加入屬性]。

  4. 選取其中一個項目從 Property Name 下拉式清單。 例如,您可以選取 Text

    由於 Text 是內建屬性, bindablerequestedit 屬性已經被檢查。

  5. 選取下列核取方塊從 IDL Attributes 選項:將屬性的 displaybinddefaultbind 至項目的 .IDL 的屬性定義檔案。 這些屬性讓控制項顯示給使用者並將內建屬性預設可繫結屬性。

此時,您的控制項可以顯示資料來源中的資料,不過,使用者將無法更新資料欄位。 如果您想要控制項也可以更新資料,請將 OnOcmCommand 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;

您現在可以建立專案,將控制項註冊。 當您在對話方塊插入控制項, Data Field 和 [資料來源] 屬性加入了,而且您在控制項現在可以選擇資料來源和欄位顯示。

建立 Bindable Get/Set 方法

除了資料繫結 get/set 方法之外,您也可以建立 繫結的內建屬性。。

注意事項注意事項

這個程序假設您有一個 ActiveX 控制項專案的子類別視窗控制項。

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

  1. 載入控制項的專案。

  2. Control Settings 頁面,為控制項選取視窗類別的子類別。 例如,您可能想要子類別化編輯控制項。

  3. 載入控制項的專案。

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

    這會開啟捷徑功能表。

  5. 從捷徑功能表中,按一下 [加入],再按一下 [加入屬性]。

  6. 在 [屬性名稱] 方塊中輸入屬性的名稱。 在這個範例中使用 MyProp。

  7. 從 [屬性型別] 下拉式清單中選取設定的資料型別。 在這個範例中使用 short

  8. 對於 Implementation Type,按一下 Get/Set Methods

  9. 從 IDL Attributes 選項選取下列核取方塊:將屬性的 bindable, requestedit, displaybinddefaultbind 加入至項目的 .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. 對標頭檔的公開部分控制項類別的標頭檔,加入下列定義 (建構函式) 成員變數:

    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;
    

您現在可以建立專案,將控制項註冊。 當您在對話方塊插入控制項, Data Field 和 [資料來源] 屬性加入了,而且您在控制項現在可以選擇資料來源和欄位顯示。

請參閱

參考

資料繫結控制項 (ADO 和 RDO)

概念

MFC ActiveX 控制項