cs_fayrous
Messages postés48Date d'inscriptionlundi 23 février 2009StatutMembreDernière intervention30 avril 2009
-
27 mars 2009 à 23:02
BELHADJRabii
Messages postés6Date d'inscriptionvendredi 27 mars 2009StatutMembreDernière intervention18 mai 2009
-
16 avril 2009 à 16:41
Salut,
pouvez vous me dire comment imprimer les données d'un formulaire?
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 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);
}
#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);
}
}
}
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 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);
cs_fayrous
Messages postés48Date d'inscriptionlundi 23 février 2009StatutMembreDernière intervention30 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?
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 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!
Vous n’avez pas trouvé la réponse que vous recherchez ?