Partager via


Contrôles ActiveX MFC : Utilisation de la liaison de données dans un contrôle ActiveX

Une des utilisations les plus puissantes des contrôles ActiveX est la liaison de données, ce qui permet à une propriété du contrôle de se lier avec un champ spécifique dans une base de données. Lorsqu'un utilisateur modifie les données de cette propriété liée, le contrôle notifie la base de données et lance une requête pour que le champ d'enregistrement soit mis à jour. La base de données informe ensuite le contrôle de la réussite ou l'échec de la demande.

Cet article couvre le côté contrôle de la tâche. Implémenter les interactions de liaison de données avec la base de données est la responsabilité du conteneur du contrôle. Comment vous gérez les interactions avec la base de données dans le conteneur n'est pas traité dans cette documentation. Comment préparer le contrôle pour la liaison de données est expliqué dans le reste de l'article.

Diagramme conceptuel d'un contrôle lié aux données

Diagramme conceptuel d'un contrôle lié aux données

La classe COleControl fournit deux méthodes qui rendent la liaison de données simple à implémenter. La première fonction, BoundPropertyRequestEdit, est utilisée pour demander l'autorisation de modifier la valeur de la propriété. BoundPropertyChanged, la deuxième fonction, est appelée une fois que la valeur de propriété a été correctement modifiée.

Cet article couvre les rubriques suivantes:

  • Créer une propriété standard pouvant être liée

  • Créer une méthode Get/Set susceptible d'être liée

Créer une propriété standard pouvant être liée

Il est possible de créer une propriété standard liée à des données, mais il est plus probable que vous souhaitiez une méthode get/set liable.

Notes

Les propriétés standard ont les attributs bindable et requestedit par défaut.

Pour ajouter une propriété stock pouvant être liée à l'aide de l'Assistant Ajout de Propriété

  1. Démarrez un projet à Assistant Contrôle ActiveX MFC.

  2. Cliquez avec le bouton droit sur le nœud de l'interface pour le contrôle.

    Cela ouvre le menu contextuel.

  3. Dans le menu contextuel, cliquez sur Ajouter puis sur Ajouter une propriété.

  4. Sélectionnez l'une des entrées dans la liste déroulante de Propriété Nom. Par exemple, vous pouvez sélectionner Texte.

    Étant donné que Texte est une propriété stock, les attributs bindable et requestedit sont déjà activés.

  5. Activez les cases à cocher suivantes de l'onglet Attributs IDL: displaybind et defaultbind pour ajouter des attributs à la définition de la propriété dans le fichier .IDL du projet. Ces attributs rendent le contrôle visible par l'utilisateur et font de la propriété standard la propriété pouvant être lié par défaut.

À ce stade, le contrôle peut afficher les données d'une source de données, mais l'utilisateur ne peut pas mettre à jour les champs de données. Si vous souhaitez que votre contrôle puisse également mettre à jour les données, modifiez la fonction  OnOcmCommand OnOcmCommand comme suit :

#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;

Vous pouvez à présent générer le projet, qui enregistrera le contrôle. Lorsque vous insérez le contrôle dans une boîte de dialogue, les propriétés Data Field et Data Source ont été ajoutées et vous pouvez maintenant sélectionner une source de données et un champ à afficher dans le contrôle.

Créer une méthode Get/Set susceptible d'être liée

En plus d'une méthode get/set liée aux données, vous pouvez également créer une propriété standard pouvant être liée.

Notes

Cette procédure suppose que vous avez un projet de contrôle ActiveX qui sous-classes un contrôle Windows.

Pour ajouter une méthode get/set pouvant être liée à l'aide de l'Assistant Ajout de Propriété

  1. Chargez votre projet de contrôle.

  2. Dans la page de Paramètres du contrôle, sélectionnez une classe de fenêtre que le contrôle va sous-classer. Par exemple, vous pouvez vouloir sous-classer un contrôle d'édition.

  3. Chargez votre projet de contrôle.

  4. Cliquez avec le bouton droit sur le nœud de l'interface pour le contrôle.

    Cela ouvre le menu contextuel.

  5. Dans le menu contextuel, cliquez sur Ajouter puis sur Ajouter une propriété.

  6. Entrez le nom de la propriété dans la zone Nom de propriété. Utilisez MyProp pour cet exemple.

  7. Sélectionnez un type de données pour le paramètre Type de propriété. dans la liste déroulante. Utilisez short pour cet exemple.

  8. Dans Type d'implémentation, cliquez sur Méthodes Get/Set.

  9. Activez les cases à cocher suivantes de l'onglet Attributs IDL : bindable: requestedit, displaybind et defaultbind pour ajouter des attributs à la définition de la propriété dans le fichier .IDL du projet. Ces attributs rendent le contrôle visible par l'utilisateur et font de la propriété standard la propriété pouvant être liée par défaut.

  10. Cliquez sur Terminer.

  11. Modifiez le corps de la fonction SetMyProp afin qu'elle contienne le code suivant :

    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. Le paramètre transmis aux fonctions BoundPropertyChanged et BoundPropertyRequestEdit est le dispid de la propriété, qui est le paramètre transmis à l'attribut d'id() de la propriété dans le fichier .IDL.

  13. Modifiez la fonction OnOcmCommand pour qu'elle contienne le code suivant :

    #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. Modifiez la fonction OnDraw afin qu'il ressemble au code ci-dessous.

    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. Dans la section publique du fichier d'en-tête pour votre classe de contrôle, ajoutez les définitions suivantes (constructeurs) pour les attributs :

    CString m_strText;
    short m_nMyNum;
    
  16. Procédez à la ligne suivante dans la dernière ligne de la fonction DoPropExchange :

    PX_String(pPX, _T("MyProp"), m_strText);
    
  17. Modifiez la fonction OnResetState afin qu'elle ressemble au code ci-dessous.

        COleControl::OnResetState();  // Resets defaults found in DoPropExchange
       m_strText = AmbientDisplayName();
    
  18. Modifiez la fonction GetMyProp afin qu'elle ressemble au code ci-dessous.

    if(AmbientUserMode())
    {
       GetWindowText(m_strText);
       m_nMyNum = (short)_ttoi(m_strText);
    }
    return m_nMyNum;
    

Vous pouvez à présent générer le projet, qui enregistrera le contrôle. Lorsque vous insérez le contrôle dans une boîte de dialogue, les propriétés Data Field et Data Source ont été ajoutées et vous pouvez maintenant sélectionner une source de données et un champ à afficher dans le contrôle.

Voir aussi

Référence

Contrôles liés aux données (ADO et RDO)

Concepts

Contrôles ActiveX MFC