Contrôles ActiveX MFC : Utilisation de la liaison de données dans un contrôle ActiveX
Une utilise plus puissantes des contrôles ActiveX est la liaison de données, qui permet une propriété du contrôle de créer une liaison 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 les demandes ces le champ d'enregistrement soient mises à jour.La base de données informe alors le contrôle de succès ou l'échec de la demande.
Cet article décrit le côté contrôle de votre tâche.Implémenter les interactions de liaison de données avec la base de données est de la responsabilité du conteneur de contrôle.La façon dont vous gérez les interactions avec la base de données dans votre conteneur n'est pas traitée dans cette documentation.Comment vous préparez le contrôle pour la liaison de données est expliqué dans le reste de cet article.
Schéma conceptuel d'un contrôle lié aux données
La classe d' COleControl fournit deux fonctions membres qui font à la liaison de données d'un processus simple pour implémenter.La première fonction, BoundPropertyRequestEdit, permet de demander l'autorisation de modifier la valeur de propriété.BoundPropertyChanged, la deuxième fonction, est appelé après que la valeur de propriété ait été correctement modifiée.
Cet article décrit les rubriques suivantes :
Créer une propriété stock pouvant être liée
Créer une méthode Get/Set pouvant être liée
Créer une propriété stock pouvant être liée
Il est possible de créer une propriété stock liée aux données, bien qu'il soit plus probable que vous souhaitiez get pouvant être liée/méthode Set.
[!REMARQUE]
Les propriétés stock ont des attributs de bindable et de requestedit par défaut.
Pour ajouter une propriété stock pouvant être liée l'Assistant Ajout de propriété
Démarrez un projet à l'aide de L'Assistant Contrôle ActiveX MFC.
Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle.
Cela ouvre le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter puis cliquez sur Ajouter une propriété.
Sélectionnez l'une des entrées de la liste déroulante de PropertyNom .Par exemple, vous pouvez sélectionner Text.
Étant donné que Text est une propriété boursières, les attributs de bindable et de requestedit sont déjà activées.
Activez les cases à cocher suivantes de l'onglet d' IDL Attributes : displaybind et defaultbind pour ajouter des attributs à la définition de propriété dans le fichier .IDL du projet.Ces attributs rendent le contrôle visible à l'utilisateur et font à la propriété du stock la propriété pouvant être liée par défaut.
À ce stade, votre contrôle peut afficher des données d'une source de données, mais l'utilisateur ne peut pas mettre à jour des champs de données.Si vous souhaitez que votre contrôle puisse également mettre à jour des données, modifiez la fonction d' OnOcmCommandOnOcmCommand pour le présenter 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 maintenant générer le projet, qui stocke le contrôle.Lorsque vous insérez le contrôle dans une boîte de dialogue, les propriétés de Data Field et Source de données auront é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 pouvant être liée
En plus d'une commande get lié aux données/méthode Set, vous pouvez également créer propriété stock pouvant être liée.
[!REMARQUE]
Cette procédure suppose que vous avez un projet de contrôle ActiveX que les sous-classes un contrôle Windows.
Pour ajouter une commande get pouvant être liée/méthode Set l'Assistant Ajout de propriété
Chargez le projet de votre contrôle.
Dans la page de Control Settings , sélectionnez une classe de fenêtre pour le contrôle à la sous-classe.Par exemple, vous pouvez souhaiter sous-classer un contrôle d'édition.
Chargez le projet de votre contrôle.
Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle.
Cela ouvre le menu contextuel.
Dans le menu contextuel, cliquez sur Ajouter puis cliquez sur Ajouter une propriété.
Tapez le nom dans la zone de Nom de la propriété .Utilisation MyProp pour cet exemple.
Sélectionnez un type de données de la zone de liste déroulante de Type de propriété .Utilisation short pour cet exemple.
Pour Implementation Type, cliquez sur Get/Set Methods.
Activez les cases à cocher suivantes de l'onglet d'attributs IDL : bindable, requestedit, displaybind, et defaultbind pour ajouter des attributs à la définition de propriété dans le fichier .IDL du projet.Ces attributs rendent le contrôle visible à l'utilisateur et font à la propriété du stock la propriété pouvant être liée par défaut.
Cliquez sur Terminer.
Modifiez le corps de la fonction d' SetMyProp afin qu'il 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(); }
Le paramètre passé aux fonctions d' BoundPropertyChanged et d' BoundPropertyRequestEdit est le dispid de la propriété, qui est le paramètre passé à l'attribut d'id() pour la propriété dans le fichier.IDL.
Modifiez la fonction d' OnOcmCommand elle contient 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;
Modifiez la fonction d' OnDraw afin qu'il contienne le code suivant :
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); }
À la section publique du fichier d'en-tête le fichier d'en-tête pour votre classe de contrôle, ajoutez les définitions suivantes (constructeurs) pour les variables membres :
CString m_strText; short m_nMyNum;
Faites à la ligne suivante la dernière ligne de la fonction d' DoPropExchange :
PX_String(pPX, _T("MyProp"), m_strText);
Modifiez la fonction d' OnResetState afin qu'il contienne le code suivant :
COleControl::OnResetState(); // Resets defaults found in DoPropExchange m_strText = AmbientDisplayName();
Modifiez la fonction d' GetMyProp afin qu'il contienne le code suivant :
if(AmbientUserMode()) { GetWindowText(m_strText); m_nMyNum = (short)_ttoi(m_strText); } return m_nMyNum;
Vous pouvez maintenant générer le projet, qui stocke le contrôle.Lorsque vous insérez le contrôle dans une boîte de dialogue, les propriétés de Data Field et Source de données auront é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)