allora funziona così:
1.crei un hashtable
dim mioarray as new hashtable()

2.Poi fai un ciclo per tutte le righe...
for i=0 to ds.tables("nometabella").rows.count-1

dove aggiungi un elemento alla volta nell hashtable, in questo esempio supponi di dover mettere come text il nome di categoria e di sotto categoria separati da "->".

arrCategorie.add (ds.tables("nometabella").rows(i)("categoria") & "->" & ds.tables("nometabella").rows(i)("sottocategoria") , ds.tables("nometabella").rows(i)("categorieid")&"~ "&ds.tables("nometabella").rows(i)("sottocategorie id"))

La virgola separa le chiavi(key) dai valori(value), chiudi il ciclo..

next

3.ora associa le chiavi e i valori al tuo controllo, associa è il nome del tuo controllo...

associa.datasource=arrCategorie
associa.datatextfield="key"
associa.datavaluefield="value"
associa.DataBind()

Questo è tutto, non credo sia difficile, naturalmente effettuando il conteggio delle righe, qualora avessi creato una query con un ordinamento, quest'ultimo non sarebbe + visibile.