Imprimer un dataset en multipages

Contenu du snippet

Ce code présente d'impression d'un document en plusieurs pages, et la manière de charcger un DataSet à partir d'une source de données OleDB

Source / Exemple :


//Variables
	//Chemin complet pour l'accès à la base de données
	private string sConnect = "My Provider MyConnectpath";

	//Data set
        private DataSet ds = null;

        //Compteur de pages
	private int iCompt = 0;
        
        //Nombres d'enregsitrements dans le dataset
	private int nbrOpération = 0;
	private int NbrField = 0;
	
	//Maximum de lignes par page	
	private int MaxLine = 20;

	//Chargement du DataSet dans une connection donnée
	//Cette fonction est appelée dans le constructeur
	private void FillDataSet()
	{
		this.Cursor = Cursors.WaitCursor;

		OleDbConnection con = new OleDbConnection(this.sConnect);
			
		OleDbCommand cmdS = new OleDbCommand("SELECT [My Field] FROM [My Table]";
		cmdS.Connection = con;

		OleDbDataAdapter adp = new OleDbDataAdapter(cmdS);
		this.ds = new DataSet();

		try
		{
			con.Open();
			this.ds.Clear();
			adp.Fill(this.ds, "SelectFld");
			
			this.NbrField = this.ds.Tables["SelectFld"].Rows.Count;
		}
		catch(Exception er)
		{
			MessageBox.Show(er.Message, "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Stop);
		}
		finally
		{
			con.Close();
			this.Cursor = Cursors.Default;
		}
	}

	// Message Begin print du PrintDocument1
	private void PrintDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
	{
		nbrOpération = this.NbrField;
		iCompt = 0;

		int totPage = 1;

				
		//Maximum de pages	
		totPage = (nbrOpération / MaxLine)+1;
		this.printDocument1.PrinterSettings.MaximumPage = totPage;

		if(this.printDocument1.PrinterSettings.FromPage > 
			this.printDocument1.PrinterSettings.ToPage)
			e.Cancel = true;

		//Mettre à jour le compteur et le nombre d'opération effectuées suivant
		// La selection  dans la boite de dialogue d'impression
		if(this.printDocument1.PrinterSettings.FromPage <= totPage)
		{
			if(this.printDocument1.PrinterSettings.FromPage > 0)
			{
				this.iCompt = 
					(this.printDocument1.PrinterSettings.FromPage - 1)* this.MaxLine;
			}
			else this.iCompt = 0;
		}
		if((this.printDocument1.PrinterSettings.ToPage > 0)&&
			(this.printDocument1.PrinterSettings.ToPage < totPage))
		{
			this.nbrOpération = this.printDocument1.PrinterSettings.ToPage *
						this.MaxLine;
		}
	}

	// Message print Page du PrintDocument1

	private void printDocDepense_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
	{
		try
		{
			System.Drawing.Graphics grf = e.Graphics;

			grf.PageUnit = System.Drawing.GraphicsUnit.Millimeter;

			Pen mpen = new Pen(Brushes.Black, 0.5f);

			//Entête du document
			string strHead = "Mon entête";
			Font fntHd = new Font(FontFamily.GenericSansSerif, 16, FontStyle.Bold);
			SizeF sizeStr = grf.MeasureString(strHead, fntHd);
			
			int cX = Convert.ToInt32((210 - sizeStr.Width)/2);

			grf.DrawString(strHead, fntHd,Brushes.Black,cX,20);
			
			grf.DrawLine(Pens.Black, new Point(25,Convert.ToInt32(25 + sizeStr.Height)), new Point(185,Convert.ToInt32(25 + sizeStr.Height)));

			
			Font fntRw = new Font(FontFamily.GenericSansSerif, 12, FontStyle.Regular);
			
			
			//Paramètres de la page
			SizeF szFnt = grf.MeasureString("Mon champs",fntRw);
			
			//Trouver la page actuelle
			int curPage = 0;
			curPage = iCompt/MaxLine + 1;

			//Limites d'une page
			int nStart = (curPage - 1) * MaxLine;
			int nEnd = nStart + MaxLine;

			//Opération effectuées (dessinées)
			int curNbrOprt = nbrOpération - iCompt;

			if(curNbrOprt > MaxLine) curNbrOprt = MaxLine;
			

			//Point haut/gauche
			int tX = 25;
			int tY = 55;

			//Largeur d'une ligne de tableau
			int coteY = Convert.ToInt32(szFnt.Height + 1);

			//La hauteur tatal du tableau (variable suivant le nombre d'enregistrements restés)
			int tHgt = Convert.ToInt32((curNbrOprt +1)* coteY);

			//Dessin du tableau de 3 colonnes et N Lignes
			Point[] tabPt = new Point[] {new Point(tX,tY),new Point(185,tY),new Point(185,tHgt+tY),
							new Point(tX,tHgt+tY),new Point(tX,tY)};

				
			grf.DrawLines(mpen, tabPt);
			
			//Une ligne Horizontale
			grf.DrawLine(mpen, new Point(tX, Convert.ToInt32(tY+coteY)),
				new Point(185, Convert.ToInt32(tY+coteY)));

			//Deux linges verticales
			grf.DrawLine(mpen, new Point(40+tX,tY), new Point(40+tX,tHgt+tY));
			grf.DrawLine(mpen, new Point(120+tX,tY), new Point(120+tX,tHgt+tY));

			
			//Dessin du texte ( centré )dans les trois cellules
			szFnt = grf.MeasureString("Mon champs 1", fntRw);
			cX = Convert.ToInt32((40-szFnt.Width)/2 + tX);

			grf.DrawString("Mon champs 1", fntRw, Brushes.Black
					,cX,Convert.ToInt32(tY+ szFnt.Height/4));

			szFnt = grf.MeasureString("Mon champs 2", fntRw);
			cX = Convert.ToInt32((80-szFnt.Width)/2 + 40 + tX);

			grf.DrawString("Mon champs 2", fntRw, Brushes.Black
					,cX,Convert.ToInt32(tY + szFnt.Height/4));

			szFnt = grf.MeasureString("Mon champs 3", fntRw);
			cX = Convert.ToInt32((40 - szFnt.Width)/2 + 120 + tX);

			grf.DrawString("Mon champs 3", fntRw, Brushes.Black
					,cX,Convert.ToInt32(tY + szFnt.Height/4));

				
			try
			{	
				while((nStart < nEnd) && (iCompt < nbrDepense) )
				{
					//Incrémenté la hauteur
					tY += coteY;

					//Obtention des données dans le dataset
					
					//Dessin du premier champs
					string strFld = ds.Tables["SelectFld"].Rows[iCompt]["My Field 1"].ToString();

					szFnt = grf.MeasureString(strFld, fntRw);
					cX = Convert.ToInt32((40-szFnt.Width)/2 + tX);

					grf.DrawString(strFld, fntRw, Brushes.Black
							,cX,Convert.ToInt32(tY+ szFnt.Height/4));

					//Dessin du deuxième champs
					strFld = ds.Tables["SelectFld"].Rows[iCompt]["My Field 2"].ToString();

					szFnt = grf.MeasureString(strFld, fntRw);
					cX = Convert.ToInt32((80-szFnt.Width)/2 + 40 + tX);
				
					grf.DrawString(strFld, fntRw, Brushes.Black
							,cX,Convert.ToInt32(tY + szFnt.Height/4));

					//Dessin du troisième champs
					strFld = prntDataset.Tables["SelectFld"].Rows[iCompt]["My Field 3"].ToString();

					szFnt = grf.MeasureString(strFld, fntRw);
					cX = Convert.ToInt32((40 - szFnt.Width)/2 + 120 + tX);

					grf.DrawString(strFld, fntRw, Brushes.Black
							,cX,Convert.ToInt32(tY + szFnt.Height/4));

					//Increment
					nStart++;
					iCompt++;
				}
			}
			catch
			{
					e.Cancel = true;
			}
			
			//On teste si il y a plusieurs pages
			if(iCompt < nbrOpération)
			{
				e.HasMorePages = true;
			}
			else
			{
				e.HasMorePages = false;
			}
			

		}
		catch
		{
			e.Cancel = true;
		}
	}

	//LinkLabel click message pour Apperçu avant impression
	private void linkLabelView_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
	{
		
		try
		{	
			this.prntPreviexDlg.Document = this.printDocument1;
			this.prntPreviexDlg.ShowDialog();			
					
		}
		catch(Exception er)
		{
			MessageBox.Show(er.Message,"My App", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
		}
	}

	//LinkLabel click message pour impression
	private void linkLabelPrint_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
	{
		
		this.printDialogRep.Document = this.printDocument1;
		this.printDialogRep.AllowSomePages = true;
			
			
		DialogResult result =  this.printDialogRep.ShowDialog();
		if(result == DialogResult.OK)
		{
			this.printDialogRep.Document.Print();
		}	
				
		catch(Exception er)
		{
			MessageBox.Show(er.Message,"My App",  
                                                MessageBoxButtons.OK, MessageBoxIcon.Stop); 
		}
	}

Conclusion :


J'ai donné ici que l'algorithme, mais au préalable, il faut préparer une forme dans laquelle se trouve deux LinkLabel un PreviewConrolDialg et un PrintDocument

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.