MFC ActiveX 控制項: 使用 ActiveX 控制項中的資料繫結
ActiveX 控制項的功能更強大的用途是資料繫結,以便在資料庫中的特定欄位繫結控制項的屬性。 當使用者修改此繫結屬性中的資料時,控制項會通知資料庫並要求更新資料錄的欄位。 然後資料庫就會通知控制項是成功或失敗的要求。
本文涵蓋您工作的控制項部分。 實作與資料庫的資料繫結互動是控制項容器的責任。 在容器中您管理資料庫互動的方式並不包含這份文件的範圍。 這份文件的其餘部分會說明如何準備進行資料繫結控制項。
資料繫結控制項的概念圖
COleControl類別會提供兩個成員函式,可讓資料繫結的簡單的程序來實作。 第一個函式中, BoundPropertyRequestEdit,用來要求權限來變更屬性值。 BoundPropertyChanged,第二個函式,會呼叫之後的屬性值已變更成功。
本文涵蓋下列主題:
建立可繫結的內建屬性
建立可繫結的 Get/Set 方法
建立可繫結的內建屬性
雖然很可能您應該就可以建立資料繫結的內建屬性, 可繫結的 get/set 方法。
注意事項 |
---|
內建屬性有可繫結 和 requestedit 預設狀況下的屬性。 |
若要新增一個可繫結的內建屬性,使用加入屬性精靈
開始專案,使用 MFC ActiveX 控制項精靈。
以滑鼠右鍵按一下控制項的 [介面] 節點。
如此會開啟快顯功能表。
從快速鍵功能表中,按一下 [ 新增 ,然後按一下 [ 加入屬性。
選取其中一個項目從屬性名稱下拉式選單。 比方說,您可以選取文字。
因為文字 是一個內建的屬性, 可繫結 和 requestedit 屬性都已檢查過。
選取下列核取方塊,從的 IDL 屬性 ] 索引標籤: displaybind 和 defaultbind 若要將屬性加入至專案中的屬性定義。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 方法,使用加入屬性精靈
載入控制項專案。
在控制設定頁面上,選取所要子類別化控制項的視窗類別。 比方說,您可能要子類別化編輯控制項。
載入控制項專案。
以滑鼠右鍵按一下控制項的 [介面] 節點。
如此會開啟快顯功能表。
從快速鍵功能表中,按一下 [ 新增 ,然後按一下 [ 加入屬性。
鍵入在 [摘要資訊名稱屬性名稱方塊。 使用MyProp為使本範例。
選取的資料類型,從屬性型別下拉式清單方塊。 使用短為使本範例。
對於實作類型,按一下 [ Get/Set 方法。
從 [IDL 屬性] 索引標籤中選取下列核取方塊: 可繫結, 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函式是屬性,也就是參數傳遞給 id () 屬性中的屬性進行的 dispid。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;
您現在可以建置專案,這樣將會註冊控制項。 當您插入控制項] 對話方塊中, 資料欄位 和 資料來源屬性將會被加入,而且您現在可以選取資料來源,並在控制項中顯示的欄位。