Imprimer un dataset en multipages

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 994 fois - Téléchargée 30 fois

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

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
mercredi 20 mai 2009
Statut
Membre
Dernière intervention
18 juillet 2009

Comment puis-je envoyer mes codes à codes sources?


Séraphin ATHIS
username: athiseraphin
Messages postés
20
Date d'inscription
lundi 3 mars 2003
Statut
Membre
Dernière intervention
7 août 2004

ptit edit: en me basant d'un code vb sur le net, voici une méthode simple et propre

private int Measure(string BannerText,Font _Font )
{
Bitmap b;
Graphics g;
Font f = new Font(_Font.Name, _Font.Size);
b = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
g = Graphics.FromImage(b);
SizeF stringSize = g.MeasureString(BannerText, f);
float Width = stringSize.Width;
g.Dispose();
b.Dispose();

return Convert.ToInt32(Width);
}
Messages postés
20
Date d'inscription
lundi 3 mars 2003
Statut
Membre
Dernière intervention
7 août 2004

désolé mais ta source n'est pas très utile dans le sens où tout est statique, jsuqu'au point haut gauche.
elle est bonne dans le cas où tu connais le nombre de champs retournés, etc. Impossible de faire une classe propre qui imprimerai tout type de datagrid. Mais c'est faisable, je me suis basé sur cette source que j'ai totalement corrigé car plein de petits bugs.
http://www.c-sharpcorner.com/Graphics/DataGridPrinterMG.asp

MAis je ne critique pas ton travail ;) il a dû te demander du temps néanmoins, dès que l'application contient plus d'un datagrid avec un nombre de colonnes différentes, le code est a jeter.

il y a néanmoins une méthode qui m'interesse chez toi.
grf.MeasureString(strFld, fntRw);
J'aimerai savoir comment tu peux deviner la longueur d'un champ sachant que selon la police et les lettres, ca ne doit pas ramener le meme nombre de pixel, meme en utilisant une police sans sherif. Je te serais très reconnaissant si tu pouvais communiquer le corps de cette méthode :)

merci
Messages postés
2
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
17 mai 2005

salut

où est initialisée cette variable : nbrDepense ?

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.