Jump to content

Recommended Posts

Posted

Boa tarde Pessoal. Eu estou a desenvolver um software de vendas e gestão de estoque em C#. Já implementei quase tudo, mas estou a encontrar dificuldades em implementar a função de impressão. Gostaria que alguém me ajudasse em como posso pegar dados de um DataGridView e passar para um relatório e posteriormente efectuar a impressão. Obrigado.

Posted

Olá,

No clique da linha ou botão de "Gerar Relatório" da sua GridView você capturar o ID do linha clicada e realiza uma consulta no banco de dados trazendo todas as informações que preciso para utilizar no relatório.

Creio que pegar os dados da Grid não seria muito seguro, pois os dados podem ter sidos atualizados anteriormente! Entende?

Posted (edited)

Faz o seguinte (como eu costumo fazer)

Crias um window form e nesse window form coloca um reportviewer (reportviewer1)

- Nesse ReportViewer associa a um Dataset (Dataset) que irás personalizar

- Desenhas o teu rdlc e colocas os campos da tabela que pretendes imprimir e em seguida personalizas o teu Dataset

============================= CS Code Do windowsForm que contem o ReportViewer ===============


public partial class FormReportOrdem : Form
{
	MySqlDataAdapter da;

	public FormReportOrdem(int id)
	{
		InitializeComponent();
		this.textMaquina.ReadOnly = true;
		this.textMaquina.Text = id.ToString();
		this.lblData.Text = DateTime.Now.ToString("dd/MM/yyyy");

		var setup = this.reportViewer1.GetPageSettings();
		setup.Margins = new System.Drawing.Printing.Margins(4, 4, 4, 4);
		this.reportViewer1.SetPageSettings(setup);
		this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout);
	}

	// Loading do report
	private void FormReportOrdem_Load(object sender, EventArgs e)
	{
		string query = " SELECT * FROM " + Controle.ord_trabalho + " " +
					   " INNER JOIN " + Controle.maquina + " " +
					   " ON ord_trabalho.maquina = maquina.maquina " +
					   " INNER JOIN " + Controle.tecnicos + " ON ord_trabalho.operador = tecnicos.tecnico " +
					   " WHERE ord_trabalho.id = @id";

		using (MySqlConnection con = new MySqlConnection(Controle.ConSql))
		{
			using (MySqlCommand cmd = new MySqlCommand(query, con))
			{
				con.Open();
				cmd.Prepare();
				cmd.Parameters.AddWithValue("@id", this.textMaquina.Text);

				da = new MySqlDataAdapter(cmd);

				DataSet ds = new DataSet();

				da.Fill(ds);

				reportViewer1.LocalReport.DataSources.Clear();

				reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet", ds.Tables[0]));
				this.reportViewer1.RefreshReport();
			}
			con.Close();
		}
	}

	// Actualizar base dados, colocar o estado da impressão p/ impresso, e refresh datagrid.
	private void FormReportOrdem_FormClosing(object sender, FormClosingEventArgs e)
	{
		string query = "UPDATE " + Controle.ord_trabalho + " SET print = 2 WHERE id=@id" ;

		using (MySqlConnection con = new MySqlConnection(Controle.ConSql))
		{
			using (MySqlCommand cmd = new MySqlCommand(query, con))
			{
				con.Open();

				cmd.Prepare();
				cmd.Parameters.AddWithValue("@id", this.textMaquina.Text);

				int printed = cmd.ExecuteNonQuery();

				if (printed > 0)
				{
				   Controle.controlarUpdate = 1;
				}
			}
			con.Close();
		}
		this.reportViewer1.LocalReport.ReleaseSandboxAppDomain();
	}

}

Depois relativamente á impressão é tudo controlado pelos comandos do report

Edited by apocsantos

You can't do it, kid. But don't worry, my boy. You're not the only one. No one else can do it.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.