Liaison dynamique des colonnes dans votre fournisseur
Assurez-vous que vous avez vraiment besoin d’une liaison de colonne dynamique. Vous en aurez peut-être besoin, car :
Vos colonnes d’ensemble de lignes ne sont pas définies au moment de la compilation.
Vous prenez en charge un élément tel que le signet qui ajoute des colonnes.
Pour implémenter une liaison de colonne dynamique
Supprimez les
PROVIDER_COLUMN_MAP
s de votre code.Dans l’enregistrement utilisateur (votre structure), ajoutez la déclaration suivante :
static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
Implémentez la
GetColumnInfo
fonction. Cette fonction décrit la façon dont les informations sont stockées. Vous devrez peut-être obtenir des propriétés ou d’autres informations pour cette fonction. Vous pouvez créer une macro, similaire à la macro COLUMN_ENTRY , pour ajouter vos propres informations.L’exemple suivant montre une
GetColumnInfo
fonction.// Check the property flag for bookmarks, if it is set, set the zero // ordinal entry in the column map with the bookmark information. CAgentRowset* pRowset = (CAgentRowset*) pThis; CComQIPtr<IRowsetInfo, &IID_IRowsetInfo> spRowsetProps = pRowset; CDBPropIDSet set(DBPROPSET_ROWSET); set.AddPropertyID(DBPROP_BOOKMARKS); DBPROPSET* pPropSet = NULL; ULONG ulPropSet = 0; HRESULT hr; if (spRowsetProps) hr = spRowsetProps->GetProperties(1, &set, &ulPropSet, &pPropSet); if (pPropSet) { CComVariant var = pPropSet->rgProperties[0].vValue; CoTaskMemFree(pPropSet->rgProperties); CoTaskMemFree(pPropSet); if (SUCCEEDED(hr) && (var.boolVal == VARIANT_TRUE)) { ADD_COLUMN_ENTRY_EX(ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD), DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK) ulCols++; } } // Next, set up the other columns. ADD_COLUMN_ENTRY(ulCols, OLESTR("Command"), 1, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szCommand) ulCols++; ADD_COLUMN_ENTRY(ulCols, OLESTR("Text"), 2, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szText) ulCols++; ADD_COLUMN_ENTRY(ulCols, OLESTR("Command2"), 3, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szCommand2) ulCols++; ADD_COLUMN_ENTRY(ulCols, OLESTR("Text2"), 4, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szText2) ulCols++; if (pcCols != NULL) *pcCols = ulCols; return _rgColumns; }