Udostępnij za pośrednictwem


Kontrolki ActiveX MFC: używanie powiązania danych w kontrolkach ActiveX

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 powiązanej z danymi.
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

  1. Rozpocznij projekt przy użyciu Kreatora kontrolek ActiveX MFC.

  2. Kliknij prawym przyciskiem myszy kontrolkę węzła interfejsu.

    Spowoduje to otwarcie menu skrótów.

  3. W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.

  4. 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.

  5. 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

  1. Załaduj projekt kontrolki.

  2. Na stronie Ustawienia sterowania wybierz klasę okna dla kontrolki do podklasy. Na przykład możesz chcieć rozszerzyć kontrolkę typu EDIT.

  3. Załaduj projekt kontrolki.

  4. Kliknij prawym przyciskiem myszy kontrolkę węzła interfejsu.

    Spowoduje to otwarcie menu skrótów.

  5. W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.

  6. Wpisz nazwę właściwości w polu Nazwa właściwości . Użyj MyProp w tym przykładzie.

  7. Wybierz typ danych z listy rozwijanej Typ właściwości . Użyj short w tym przykładzie.

  8. W polu Typ implementacji kliknij pozycję Pobierz/Ustaw metody.

  9. 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ą.

  10. Kliknij przycisk Finish (Zakończ).

  11. 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();
    }
    
  12. Parametr przekazywany do funkcji BoundPropertyChanged i BoundPropertyRequestEdit jest dispidem właściwości, który jest parametrem przekazywanym do atrybutu id() dla właściwości w pliku .IDL.

  13. 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;
    
  14. 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);
    }
    
  15. 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;
    
  16. Ustaw następujący wiersz jako ostatni wiersz w DoPropExchange funkcji:

    PX_String(pPX, _T("MyProp"), m_strText);
    
  17. Zmodyfikuj OnResetState funkcję tak, aby zawierała następujący kod:

    m_strText = AmbientDisplayName();
    m_strText = AmbientDisplayName();
    
  18. 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.

Zobacz także

Kontrolki ActiveX MFC