Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jednym z bardziej zaawansowanych zastosowań kontrolek ActiveX jest powiązanie danych, które umożliwia powiązanie kontrolki z określonym polem w bazie danych. Gdy użytkownik modyfikuje dane w tej powiązanej właściwości, kontrolka powiadamia bazę danych i żąda zaktualizowania pola rekordu. Następnie baza danych powiadamia kontrolę nad powodzeniem lub niepowodzeniem żądania.
Ważne
ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji na temat nowoczesnych technologii zastępujących activex, zobacz Kontrolki ActiveX.
W tym artykule omówiono aspekt kontrolny twojego zadania. Implementowanie interakcji powiązania danych z bazą danych jest obowiązkiem kontenera sterowania. Sposób zarządzania interakcjami bazy danych w kontenerze wykracza poza zakres tej dokumentacji. Sposób przygotowania kontrolki do powiązania danych wyjaśniono w pozostałej części tego artykułu.
Diagram koncepcyjny kontrolki Data-Bound
Klasa COleControl
udostępnia dwie funkcje składowe, które sprawiają, że powiązanie danych jest łatwym procesem do zaimplementowania. Pierwsza funkcja BoundPropertyRequestEdit służy do żądania uprawnień do zmiany wartości właściwości.
BoundPropertyChanged, druga funkcja, jest wywoływana po pomyślnym zmianie wartości właściwości.
W tym artykule opisano następujące tematy:
Tworzenie powiązanej właściwości zasobów
Istnieje możliwość utworzenia właściwości stock powiązanej z danymi, chociaż jest bardziej prawdopodobne, że chcesz powiązać metodę get/set.
Uwaga / Notatka
Właściwości magazynowe mają atrybuty bindable
i requestedit
domyślnie.
Aby dodać wiązalną standardową właściwość przy użyciu Kreatora Dodawania Właściwości
Rozpocznij projekt przy użyciu Kreatora kontrolek ActiveX MFC.
Kliknij prawym przyciskiem myszy kontrolkę węzła interfejsu.
Spowoduje to otwarcie menu skrótów.
W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.
Wybierz jeden z wpisów z listy rozwijanej Nazwa właściwości . Możesz na przykład wybrać pozycję Tekst.
Ponieważ właściwość Text jest domyślną właściwością, atrybuty możliwe do powiązania i atrybuty żądania edycji są już sprawdzane.
Zaznacz następujące pola wyboru na karcie Atrybuty IDL: displaybind i defaultbind, aby dodać atrybuty do definicji właściwości w pliku .IDL projektu. Te atrybuty sprawiają, że kontrolka jest widoczna dla użytkownika i sprawia, że właściwość stock jest domyślną właściwością powiązaną.
W tym momencie kontrolka może wyświetlać dane ze źródła danych, ale użytkownik nie będzie mógł aktualizować pól danych. Jeśli chcesz, aby kontrolka mogła również aktualizować dane, zmień OnOcmCommand
funkcję OnOcmCommand, aby wyglądała następująco:
#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;
Teraz możesz skompilować projekt, który zarejestruje kontrolkę. Po wstawieniu kontrolki w oknie dialogowym właściwości Pola danych i źródła danych zostaną dodane i można teraz wybrać źródło danych i pole do wyświetlenia w kontrolce.
Tworzenie wiązanej metody Get/Set
Oprócz metody get/set powiązanej z danymi można również utworzyć powiązaną właściwość stockową.
Uwaga / Notatka
W tej procedurze przyjęto założenie, że masz projekt kontrolki ActiveX, który podklasuje kontrolkę systemu Windows.
Aby dodać powiązaną metodę get/set przy użyciu Kreatora dodawania właściwości
Załaduj projekt kontrolki.
Na stronie Ustawienia sterowania wybierz klasę okna dla kontrolki do podklasy. Na przykład możesz chcieć rozszerzyć kontrolkę typu EDIT.
Załaduj projekt kontrolki.
Kliknij prawym przyciskiem myszy kontrolkę węzła interfejsu.
Spowoduje to otwarcie menu skrótów.
W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.
Wpisz nazwę właściwości w polu Nazwa właściwości . Użyj
MyProp
w tym przykładzie.Wybierz typ danych z listy rozwijanej Typ właściwości . Użyj
short
w tym przykładzie.W polu Typ implementacji kliknij pozycję Pobierz/Ustaw metody.
Zaznacz następujące pola wyboru na karcie Atrybuty IDL: bindable, requestedit, displaybind i defaultbind, aby dodać atrybuty do definicji właściwości w projekcie .IDL. Te atrybuty sprawiają, że kontrolka jest widoczna dla użytkownika i sprawia, że właściwość stock jest domyślną właściwością powiązaną.
Kliknij przycisk Finish (Zakończ).
Zmodyfikuj treść
SetMyProp
funkcji, tak aby zawierała następujący kod: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(); }
Parametr przekazywany do funkcji
BoundPropertyChanged
iBoundPropertyRequestEdit
jest dispidem właściwości, który jest parametrem przekazywanym do atrybutu id() dla właściwości w pliku .IDL.Zmodyfikuj funkcję OnOcmCommand , aby zawierała następujący kod:
#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;
Zmodyfikuj
OnDraw
funkcję tak, aby zawierała następujący kod: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); }
W publicznej sekcji pliku nagłówka dla klasy kontrolnej dodaj następujące definicje i konstruktory dla zmiennych składowych:
CString m_strText; short m_nMyNum;
Ustaw następujący wiersz jako ostatni wiersz w
DoPropExchange
funkcji:PX_String(pPX, _T("MyProp"), m_strText);
Zmodyfikuj
OnResetState
funkcję tak, aby zawierała następujący kod:m_strText = AmbientDisplayName(); m_strText = AmbientDisplayName();
Zmodyfikuj
GetMyProp
funkcję tak, aby zawierała następujący kod:if (AmbientUserMode()) { GetWindowText(m_strText); m_nMyNum = (short)_ttoi(m_strText); } return m_nMyNum;
Teraz możesz skompilować projekt, który zarejestruje kontrolkę. Po wstawieniu kontrolki w oknie dialogowym właściwości Pola danych i źródła danych zostaną dodane i można teraz wybrać źródło danych i pole do wyświetlenia w kontrolce.