Dynamisches Binden von Spalten im Anbieter
Aktualisiert: November 2007
Prüfen Sie, ob die dynamische Spaltenbindung wirklich erforderlich ist. Möglicherweise ist sie aus folgenden Gründen erforderlich:
Rowsetspalten werden nicht zur Kompilierungszeit definiert.
Es werden Elemente wie Lesezeichen unterstützt, durch die Spalten hinzugefügt werden.
So implementieren Sie die dynamische Spaltenbindung
Entfernen Sie alle PROVIDER_COLUMN_MAP-Zuordnungen aus dem Code.
Fügen Sie dem Benutzerdatensatz (Ihrer Struktur) die folgende Deklaration hinzu:
static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
Implementieren Sie die GetColumnInfo-Funktion. Diese Funktion legt fest, wie die Informationen gespeichert und angeordnet werden. Für diese Funktion müssen Sie u. U. Eigenschaften oder andere Informationen abrufen. Um die Informationen hinzuzufügen, können Sie ein Makro wie COLUMN_ENTRY erstellen.
Im folgenden Beispiel ist eine GetColumnInfo-Funktion dargestellt.
// 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; }