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
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.