you only need to pass it to datatable and dataset, i think it can be done with CR too (with same technique) but you'll need to change a few line of code because i never use CR, here is what i do with ReportViewer :
i add a DataGridView1 (i add two column for example) to Form1 and a Button too (Print Preview Button).
i add another Form (Form2) to hold ReportViewer.
still on Form2, i add a ReportViewer (set it to dock in parent container with clicking little arrow on right top corner of ReportViewer).
i add a DataSet (click Project>Add New Item.. on Data template choose DataSet).
i add a Report.rdlc (click Project>Add New Item.. on Reporting template choose Report or Report Wizard, i use Report).
go to your DataSet1, right click than choose Add>Data Table.
right click on DataTable1, and choose Add>Column or you can use ctrl+L, if you have two column on your DataGridView in Form1 than you have to add two column too on DataTable1 (amount of column on DataTable1 = amount of column on DataGridview1), name it what ever you want, default is DataColumn1, DataColumn2, and so on..).
go to your Form1, on Print Preview Button add this code :
Dim dtReport As New DataTable
Form2.ReportViewer1.LocalReport.DataSources.Item(0).Value = dtReport
Catch ex As Exception
go to your Report.rdlc, on top left corner click "New" then choose "Dataset..", on DataSource choose DataSet1 that you add before, click ok.
still on your Report.rdlc, add a Table from ToolBox, you can delete the header, left click on first cell, you will see small blue icon, click it and choose DataColumn1, DataColumn2 for second cell.
For Each ctrl As Control In Me.Controls("pnlMainPanel").Controls
If ctrl.GetType Is GetType(System.Windows.Forms.Panel) Then
For Each subCtrl As Control In ctrl.Controls
If subCtrl.GetType Is GetType(System.Windows.Forms.TextBox) Then
If subCtrl.GetType Is ...