Visto che hai provato varie soluzioni, ti propongo la mia.

Prima di tutto non uso CrystalReport.

Secondo. Creo una pagina html adeguatamente formattata per la stampa con foglio di stile oppurtuno, riempita di dati di prova.
Quando ho raggiungo il risultato voluto prendo l'html risultante e lo replico in una pagina aspx con dati veri.

Leggo da database la fattura in un DataTable. Recuperato l'id_fattura, leggo i dettagli in un altro DataTable. Nota che il DataSet non serve.

Adesso che ho i dati in due DataTable, creo una StringBuilder leggendo i dati prima dal primo DataTable, poi dal secondo DataTable.

La spiegazione può anche non essere chiara, ma ti assicuro che funziona. E funziona pure se devi produrre il report in un pdf. Alla fine dei conti, quello che chiami report, non è altro che html formattato adeguatamente.


  • ps. il c# è molto simile al vb.net. Basta una minima conoscenza per utilizzare tutto quello che si trova in rete.