MFC ActiveX 控制項:在 ActiveX 控制項中使用資料繫結
其中一個 ActiveX 控制項更強大的用途是資料繫結,讓控制項屬性繫結至資料庫中的特定欄位。 當使用者修改這個繫結資料時,控制項通知資料庫並要求記錄欄位更新。 資料庫會通知要求成功的控制項或失敗。
本文將工作的控制項。 實作與資料庫中的資料繫結互動是控制項容器的責任。 如何處理在容器的資料庫互動超出這個文件的範圍之外。 如何準備資料繫結的控制項在其他說明本文。
資料繫結控制項的概念圖
COleControl 類別提供讓資料繫結簡單流程實作的兩個成員函式。 第一個函式, BoundPropertyRequestEdit,用來要求使用權限變更屬性值。 在成功變更之後,BoundPropertyChanged,第二個函式,呼叫屬性值。
本章節涵蓋下列主題:
建立 Bindable 內建屬性。
建立 Bindable Get/Set 方法
建立 Bindable 內建屬性。
建立資料繫結共用屬性,但是,雖然較可能會想要 繫結 get/set 方法。
![]() |
---|
預設為內建屬性有 bindable 和 requestedit 屬性。 |
使用加入屬性精靈,將可繫結的內建屬性。
使用 MFC ActiveX 控制項精靈,啟動專案。
以滑鼠右鍵按一下控制項的介面節點。
這會開啟捷徑功能表。
從捷徑功能表中,按一下 [加入],再按一下 [加入屬性]。
選取其中一個項目從 Property Name 下拉式清單。 例如,您可以選取 Text。
由於 Text 是內建屬性, bindable 和 requestedit 屬性已經被檢查。
選取下列核取方塊從 IDL Attributes 選項:將屬性的 displaybind 和 defaultbind 至項目的 .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 方法
載入控制項的專案。
在 Control Settings 頁面,為控制項選取視窗類別的子類別。 例如,您可能想要子類別化編輯控制項。
載入控制項的專案。
以滑鼠右鍵按一下控制項的介面節點。
這會開啟捷徑功能表。
從捷徑功能表中,按一下 [加入],再按一下 [加入屬性]。
在 [屬性名稱] 方塊中輸入屬性的名稱。 在這個範例中使用 MyProp。
從 [屬性型別] 下拉式清單中選取設定的資料型別。 在這個範例中使用 short。
對於 Implementation Type,按一下 Get/Set Methods。
從 IDL Attributes 選項選取下列核取方塊:將屬性的 bindable, requestedit, displaybind 和 defaultbind 加入至項目的 .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); }
對標頭檔的公開部分控制項類別的標頭檔,加入下列定義 (建構函式) 成員變數:
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;
您現在可以建立專案,將控制項註冊。 當您在對話方塊插入控制項, Data Field 和 [資料來源] 屬性加入了,而且您在控制項現在可以選擇資料來源和欄位顯示。