I have a problem, regarding creating a reportviewer. I've programmed a structure, which calls the report, passes a single parameter to the report, saves it as a PDF, and opens the same with the native PDF reader.
Here is the code for this part:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Reporting.WebForms;
using System.IO;
using System.Diagnostics;
namespace teste_em_report_viewer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BtnGerar_Click(object sender, EventArgs e)
{
// responsável por visualizar o relatório
ReportViewer reportViewer = new ReportViewer();
// esse relatorio vai ser processado nessa maquina
reportViewer.ProcessingMode = ProcessingMode.Local;
// caminho para encontrar o relatório
reportViewer.LocalReport.ReportEmbeddedResource = "teste_em_report_viewer.MeuRelatorio .rdlc";
//parâmetros do Relatório
// lista com varios parâmetros
List<ReportParameter> listReportParameter = new List<ReportParameter>();
// dentro do construtor ReportParameter, eu passei o nome do parâmetro criado no report la, e passei o conteúdo que eu quero enviar para ele
listReportParameter.Add(new ReportParameter("ReportParameter1", TxtNome.Text));
//listReportParameter.Add(new ReportParameter("Endereco", TxtEndereco.Text));
// passei a lista de parâmetros para o meu report, declarado la em cima
reportViewer.LocalReport.SetParameters(listReportParameter);
// criado apenas para caso dê erros, o sistema encorpora os erros nessas variáveis
Warning[] warning;
string[] streamids;
string mimeType;
string encoding;
string extension;
// array de bytes, eu crio ele, passo o array, e o usuário renderiza
// os dois parametros são os mais importantes, que são o formato(extensão) e o segundo, eu passo nulo... out eu estou passando as variáveis por referência
// esse ja é o meu relatório
byte[] bytePDF = reportViewer.LocalReport.Render
(
"pdf",null, out mimeType, out encoding, out extension, out streamids, out warning
);
// esse comando é responável por transferir meu relatório e salvar na minha maquina local
FileStream fileStreamPDF = null;
/* esses recursos permitem que um arquivo sempre terá um nome único
*
* path.gettempath() = pega o caminho da minha pasta TEMP
* "RelatorioDiego" = o nome que eu quiser dar pro meu relatorio
* DateTime.Now.Tostring() = Concatena o horário no momento criado, junto ao nome, para evitar nomes duplicados
* +".pdf" = concatena a extensão do meu arquivo
* */
string nomeArquivoPDF = Path.GetTempPath() +
"RelatorioDiego" + DateTime.Now.ToString("dd_MM_yyyy-HH_mm_ss") + ".pdf";
// local C:\Users\diegolinkk\AppData\Local\Temp
// cria o arquivo com o nome que eu defini acima
fileStreamPDF = new FileStream(nomeArquivoPDF, FileMode.Create);
// ele vai escrever o meu array de byte relatorio "bytepdf", da posição inicial [0], até a posição final [byte.lengh]
fileStreamPDF.Write(bytePDF, 0, bytePDF.Length);
//escreve, fecha
fileStreamPDF.Close();
// comando que encontra o arquivo, seleciona o programa que abre aquele arquivo, e abre
// passando o caminho completo com o caminho do arquivo
Process.Start(nomeArquivoPDF);
}
private void button1_Click(object sender, EventArgs e)
{
teste_chamar_form_de_outro_local Form2 = new teste_chamar_form_de_outro_local();
Form2.Show();
}
}
}
Until this section, there are no problems, the parameters work correctly and everything.
But when I add a table in the reportviewer through a DataSet
, to insert tables in the reportviewer, the program starts to point out an error in that section:
byte[] bytePDF = reportViewer.LocalReport.Render("pdf", null, out mimeType, out encoding, out extension, out streamids, out warning);
and it only works again, if I delete the dataset from my reportviewer.
I'd like to know if anyone can help me solve this problem. Where am I going wrong? What is the best way to implement all this and how can I pass objects I created directly to the reportviewer? How?