Hi bigbear,
There is no need to convert to DataTable. You can pass the List to the ReportDataSource.
Check this example. Now please take its reference and correct your code.
Database
For this example I have used of Northwind database that you can download using the link given below.
Download Northwind Database
Namespaces
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Ionic.Zip;
using Microsoft.Reporting.WebForms;
Controller
public class HomeController : Controller
{
// GET: /Home/Export
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Export(string[] quoteIDs)
{
List<byte[]> bytesArray = new List<byte[]>();
List<string> fileNameArray = new List<string>();
NorthwindEntities entities = new NorthwindEntities();
if (quoteIDs != null)
{
string reportType = "PDF";
string mimeType = "", encoding = "", fileNameExtension = "";
foreach (var qid in quoteIDs)
{
List<Customer> lstCustomers = new List<Customer>();
var quote = entities.Customers.Where(x => x.CustomerID == qid).FirstOrDefault();
lstCustomers.Add(quote);
LocalReport localReport = new LocalReport()
{
ReportPath = Server.MapPath("~/CustomerReport.rdlc")
};
ReportDataSource rds = new ReportDataSource("Customers", lstCustomers);
localReport.DataSources.Add(rds);
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>" + reportType + "</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.5in</MarginTop>" +
" <MarginLeft>0in</MarginLeft>" +
" <MarginRight>0in</MarginRight>" +
" <MarginBottom>0in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
string[] streams;
byte[] renderedBytes = localReport.Render(reportType, deviceInfo, out mimeType, out encoding,
out fileNameExtension, out streams, out warnings);
bytesArray.Add(renderedBytes);
fileNameArray.Add(qid + "." + fileNameExtension);
}
TempData["Data"] = bytesArray;
TempData["File"] = fileNameArray;
return new JsonResult() { Data = new { MimeType = mimeType } };
}
return RedirectToAction("VirtualService");
}
[HttpGet]
public virtual ActionResult Download(string mimeType)
{
if (TempData["Data"] != null)
{
List<byte[]> bytesArray = TempData["Data"] as List<byte[]>;
List<string> fileNames = TempData["File"] as List<string>;
using (ZipFile zip = new ZipFile())
{
zip.AlternateEncodingUsage = ZipOption.AsNecessary;
int i = 0;
foreach (byte[] bytes in bytesArray)
{
zip.AddEntry(fileNames[i], bytes);
i++;
}
string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
using (MemoryStream memoryStream = new MemoryStream())
{
zip.Save(memoryStream);
return File(memoryStream.ToArray(), "application/zip", zipName);
}
}
}
else
{
return new EmptyResult();
}
}
}
View
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$('#btnGetChecks').on('click', function () {
var arrSelectedQIDs = [];
$("input:checked").each(function (index, value) {
arrSelectedQIDs.push($(value).val());
});
$.ajax({
type: "POST",
url: "/Home/Export/",
contentType: "application/json; charset=utf-8",
data: { "quoteIDs": arrSelectedQIDs },
success: function (data) {
window.location = '/Home/Download?filename=' + data.MimeType;
},
error: function (request, status, error) {
alert("error " + request.responseText);
}
});
});
});
</script>
<input type="checkbox" value="ALFKI" />ALFKI<br />
<input type="checkbox" value="BOLID" />BOLID<br />
<input type="checkbox" value="BOTTM" />BOTTM<br />
<input type="button" name="command" id="btnGetChecks" value="Generate Selected" />
This will generate zip file containg each record as separate pdf file.
For zip file i have used below article.