Imprimer les données d'un formulaire [Résolu]

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

merci d'avance.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 28 mars 2009 à 08:28
3
Merci
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cs_Robert33
Meilleure réponse
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 28 mars 2009 à 10:26
3
Merci
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cs_Robert33
cs_fayrous 48 Messages postés lundi 23 février 2009Date d'inscription 30 avril 2009 Dernière intervention - 28 mars 2009 à 09:52
0
Merci
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?
Commenter la réponse de cs_fayrous
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 28 mars 2009 à 10:34
0
Merci
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!
Commenter la réponse de cs_Robert33
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 1 avril 2009 à 09:22
0
Merci
Voire éventuellement aussi:
http://www.csharpfr.com/codes/TUTORIAL-SUR-IMPRESSION_39939.aspx

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
BELHADJRabii 7 Messages postés vendredi 27 mars 2009Date d'inscription 18 mai 2009 Dernière intervention - 16 avril 2009 à 16:41
0
Merci
merci tres bien M. Robert
grace a ton aide j'ai bien avancé dans mon projet
Commenter la réponse de BELHADJRabii

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.