Imprimer les données d'un formulaire

Résolu
cs_fayrous Messages postés 48 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 30 avril 2009 - 27 mars 2009 à 23:02
BELHADJRabii Messages postés 6 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 18 mai 2009 - 16 avril 2009 à 16:41
Salut,
pouvez vous me dire comment imprimer les données d'un formulaire?

merci d'avance.

6 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
28 mars 2009 à 08:28
Re bonjour Fayrous

en te servant de l'exemple que je t'ai envoyé pour le panel,
ajoute un nouveau bouton (button2) sur la forme, et le code suivant:

attention il faut ajouter en tête du programme.
   using System.Drawing.Printing ;

Le principe est le même que pour le dessin sur le Panel, sauf que cette fois on dessine sur une page d'impression, et qu'il faut gerer les saut de page.

fais aussi attention aux '}' , ce code possede une definition de classe qui arrive apres le code de la Form1
j'utilise cette redefinition de la classe PrintDocument pour gerer les imprimantes réseau car si l'imprimante réseau ne répond pas il faut récuperer une exeption qui est masquée dans la classe PrintDocument standard, et ça plante le programme.

A+ :)

private void button2_Click(object sender, System.EventArgs e)

   PrinterSettings def=new PrinterSettings(); 
   PrintPreviewDialog printPreviewDialog1= new PrintPreviewDialog(); 
   MyPrintDocument printDocument1 = new MyPrintDocument(); 
   printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint); 
   printDocument1.EndPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_EndPrint); 
   printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage); 

   printDocument1.PrintController=new MyPrintController(); 
   printDocument1.PrinterSettings.PrinterName = def.PrinterName; 
   printDocument1.DefaultPageSettings.Landscape=false; 
   if (!printDocument1.PrinterSettings.IsValid ) 
   { 
      MessageBox.Show("Veuillez vérifier l'imprimante "+def.PrinterName+Environment.NewLine+"Car elle ne semblepas répondre." ); 
   return; 
   } 
   printPreviewDialog1.Document = printDocument1; 
   printPreviewDialog1.Width = Screen.PrimaryScreen.WorkingArea.Width - 50; 
   printPreviewDialog1.Height = Screen.PrimaryScreen.WorkingArea.Height - 200; 
   printPreviewDialog1.StartPosition = FormStartPosition.CenterScreen; 
   printPreviewDialog1.PrintPreviewControl.StartPage = 1; 
   printPreviewDialog1.PrintPreviewControl.Columns = 3; 

   try 
   { 
      printPreviewDialog1.ShowDialog(); 
      DialogResult=DialogResult.OK; 
   } 
   catch (Exception ex) 
   { 
      Console.WriteLine(ex.ToString()); 
   }

}
#region print
float m_fVerticalMargin = 30;
float m_fHorizontalMargin = 40;
bool m_bMorePages;
float m_fPageHeight;
Pen blackPen = new Pen(Color.Black, 2);
Pen BorderPen = new Pen(Color.Gray, 2);
Font _Font = new Font("Lucida Sans Typewriter",12);
Brush _Brush = new SolidBrush(Color.Black);
 
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
LastPrintedLine=-1;
m_bMorePages = false;

}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
m_fPageHeight = e.PageBounds.Height-(2*m_fVerticalMargin)-20;

LastPrintPositionY = 10 ;

Print(e.Graphics);
if (m_bMorePages)
{
e.HasMorePages = true;
m_bMorePages = false;
}
}
 
 
int LastPrintedLine=-1;
float LastPrintPositionY = 10 ;

private void Print(Graphics g)
{
FillPage(g);
}
 
private void FillPage(Graphics g)
{
for (int i = LastPrintedLine+1; i< myTextBoxArray.Length ; i++)
{
string s = myTextBoxArray[i].Text ;
SizeF pSize = g.MeasureString(s, _Font);
// Fit in the page height ?
if (LastPrintPositionY + pSize.Height > m_fPageHeight )
{
m_bMorePages = true;
return;
}
g.DrawString(s,_Font, Brushes.Black,
m_fHorizontalMargin+7,
LastPrintPositionY+m_fVerticalMargin);
LastPrintPositionY+=pSize.Height;
LastPrintedLine++;
}
}
 
 
private void printDocument1_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{

}
#endregion
} // ceci est la fin du code de la classe de la form1

//Network printer problems ...
//With standard printerController, if the network printer does not answer, we got an unattended and uncachable RPC exception
// the only way is to redefine our own objects
// a printDocument that handle a special status to cancel the curretn print on error
// a printerController that can detect a RPC error and then cancel the current print
class MyPrintDocument:PrintDocument
{
public bool Cancelled = false;
protected override void
OnQueryPageSettings(QueryPageSettingsEventArgs e)
{
e.Cancel = Cancelled;
base.OnQueryPageSettings(e);
}
}
class MyPrintController : StandardPrintController
{
public override void OnStartPrint(PrintDocument document,
PrintEventArgs e)
{
try
{
base.OnStartPrint(document, e);
}
catch (Exception exp)
{
((MyPrintDocument)document).Cancelled = true;
MessageBox.Show(exp.Message);
}
}
}

C# is amazing, enjoy it!
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
28 mars 2009 à 10:26
re,
Oui c'est pas compliquer,

d'abord il faut définir la longueur de ton rectangle ,
la hauteur etant connue car c'est celle de la chaine de caracteres

le dessin de la chaine doit ensuite être décalé sur la droite de la largeur du rectangle
attention le calcul de la longueur de la chaine doit tenir compte de la longueur de rectangle.

avant, ou apres, avoir dessiné la chaine, dessine le rectangle.
il faut faire la même chose pour l'impression.

ex, en partant du code pécédent

//définis une variable pour la largeur de ton rectangle:
   int rectangleWith=30;

Dans la method panel1_Paint, remplace le code de la boucle par celui-la:

for (int i=0; i< myTextBoxArray.Length; i++)

   string StringToDraw = string.Format("Question {0} : {1}",i,myTextBoxArray[i].Text); 
   //Determine lan longueur de la chaine en tenant compte du rectangle de gauche 
   SizeF size =g.MeasureString(StringToDraw, myFont,panel1.Width-rectangleWith,stringFormat); 

   // dessine un rectangle devant le texte 
   g.DrawRectangle(Pens.Black,
      0,
      yPos,
      rectangleWith, // largeur prédéfinie
      size.Height); // hauteur calculée de la chaine

   //La chaine des dessinée plus à droite. 
   g.DrawString(StringToDraw, 
      myFont, 
      Brushes.Black, 
      new RectangleF(rectangleWith+2,yPos+2,size.Width,size.Height));  // on décale de la largeur du rectangle
      yPos += size.Height+6;
}

Pour l'impression, dans la methode FillPage, remplace l'instruction drawString (...) par ces lignes:

   // dessine un rectangle devant le texte 
   g.DrawRectangle (Pens.Black,
      m_fHorizontalMargin,
      LastPrintPositionY+m_fVerticalMargin,
      rectangleWith,
      pSize.Height); 
   g.DrawString(s,_Font, Brushes.Black, 
      rectangleWith+m_fHorizontalMargin+7, 
      LastPrintPositionY+m_fVerticalMargin);

C# is amazing, enjoy it!
3
cs_fayrous Messages postés 48 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 30 avril 2009
28 mars 2009 à 09:52
Bonjour MR Bobert33,
merci beaucoup.
grâce à tes aides j'ai avancées un peu dans mon projet.
Mais S.V.P , concernant l'exemple que tu m'ai envoyé pour le panel , je voudrai que le rectangle soit devant chaque chaine et non pas l'entour.
je crois qu'on peut dessiner des lignes ,des rectangles sur la page qu'on va imprimer.donc au lieu de dessiner les rectangles dans un panel ,je veux la dessiner sur la page à imprimer .
je ne sais pas comment je doit faire.
je sais que j'ai beaucoup des questions, mais S.V.P aidez moi?
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
28 mars 2009 à 10:34
Re,

Juste pour te dire qu'en partant de ce code tu peux en fait déssiner tous ce que tu veux sur le panel ou la feuille imprimée.
Regarde dans les fonctions Graphic..... tu va trouver plein de chose sympa.

Le tout étant de bien memoriser la taille de ton dessin pour dessiner le prochain en dessous.

Considere ton panel comme une feuille de papier sur laquelle tu dessinerais avec un crayon, repere les coordonnées et reproduis dans le code ce que tu ferais à la main.

C# is amazing, enjoy it!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 avril 2009 à 09:22
0
BELHADJRabii Messages postés 6 Date d'inscription vendredi 27 mars 2009 Statut Membre Dernière intervention 18 mai 2009
16 avril 2009 à 16:41
merci tres bien M. Robert
grace a ton aide j'ai bien avancé dans mon projet
0
Rejoignez-nous