Udostępnij przez


Dynamiczne powiązanie kolumn w dostawcy

Upewnij się, że naprawdę potrzebujesz powiązania kolumny dynamicznej. Może być potrzebny, ponieważ:

  • Kolumny zestawu wierszy nie są definiowane w czasie kompilacji.

  • Obsługujesz element, taki jak zakładka, która dodaje kolumny.

Aby zaimplementować powiązanie kolumny dynamicznej

  1. Usuń wszystkie PROVIDER_COLUMN_MAPs z kodu.

  2. W rekordzie użytkownika (struktura) dodaj następującą deklarację:

    static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
    
  3. Zaimplementuj GetColumnInfo funkcję. Ta funkcja określa sposób przechowywania informacji. Może być konieczne pobranie właściwości lub innych informacji dla tej funkcji. Aby dodać własne informacje, możesz utworzyć makro podobne do makra COLUMN_ENTRY .

    W poniższym przykładzie przedstawiono GetColumnInfo funkcję.

    // 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;
    }
    

Zobacz też

Praca z szablonami dostawców OLE DB