Dim r As String = CStr(MsgBox("Etes vous sûre de vouloir imprimer cette page ?", CType(vbQuestion + vbYesNo + vbDefaultButton2, MsgBoxStyle))) If CDbl(r) <> vbYes Then Exit Sub
If (MessageBox.Show("Etes vous sûr de vouloir imprimer cette page ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No) Then Exit Sub
iTmpWidth = CType(Math.Floor(CType((CType(GridCol.Width, Double) / (CType(iTotalWidth, Double) * (CType(iTotalWidth, Double) * (CType(e.MarginBounds.Width, Double) / CType(iTotalWidth, Double))))), Double)), Integer)
iTmpWidth = CInt((Math.Floor(CDbl(CDbl(GridCol.Width) / CDbl(iTotalWidth) * CDbl(iTotalWidth) * (CDbl(e.MarginBounds.Width) / CDbl(iTotalWidth))))))
iTmpWidth = CInt(CDbl(GridCol.Width) * CDbl(e.MarginBounds.Width) / CDbl(iTotalWidth))
Bonjour,
J'ai essayé votre code pour imprimer un datagridview, mais je n'obtiens pas le résultat escompté. j'obtiens une boucle sans fin avec impression multiple de la première page du datagridview. Je tiens à vous dire que je ne suis pas un informaticien expérimenté mais que j'essaye d'apprendre. Je vous remercie par avance si vous vouliez-bien m'éclairer.
Bonjour Michel
depuis 8 ans, tu imagines bien que je ne me souviens pas bien de ce sujet.
Mais juste en lisant la question initiale, le problème était justement que cela bouclait de façon infinie.
A priori, le sujet a été résolu, donc peut-être qu'en relisant en détail la conversation tu auras la réponse au problème.
Si ça n'est pas le cas, signale le et je m'y pencherai dans le week-end.
Il faudra aussi préciser le framework que tu utilises car entre le 4 de 2016 et le 8 d'aujourd'hui y a pas mal de différences
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionRe bonjour,
Dans une de ses interventions DORSAF écrivait :
En plus j'ai résolu mon premier problème de boucle infini ; c'était juste une parenthèse mal placé dans la conversion.
Mais il n'indique pas la solution de manière explicite, je vais donc chercher cette fichue parenthèse mal placée.
J'utilise le net framework 4.7.2
Bonjour
J'ai un peu cherché la fameuse parenthèse sans trouver la solution.
Il faut dire que des parenthèses inutiles, y'en a un paquet dans ce code.
Pire des conversions de type qui ne servent à rien qui ajoutent leur lot de parenthèses.
Le code initial en C# possède déjà ces caractéristiques et la conversion C# -> vb automatique utilisée à l'époque a ajouté du bazar en plus
Bref c'est très mal écrit.
J'ai refait une conversion automatique (avec sa livrée de bazar), qui ne donne pas le même code et ce code fonctionne.
Public Shared arrColumnLefts As ArrayList = New ArrayList Public Shared arrColumnWidths As ArrayList = New ArrayList Public Shared iCellHeight As Double Public Shared iCount As Double Public Shared bFirstPage As Boolean Public Shared bNewPage As Boolean Public Shared iTotalWidth As Double Public Shared strFormat As StringFormat Private Sub bt_imprimer_tva_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_imprimer_tva.Click Dim r As String = CStr(MsgBox("Etes vous sûre de vouloir imprimer cette page ?", CType(vbQuestion + vbYesNo + vbDefaultButton2, MsgBoxStyle))) If CDbl(r) <> vbYes Then Exit Sub 'paramétres d'impression PrintDialog1.PrinterSettings = PrintDocument1.PrinterSettings PrintDialog1.AllowSomePages = True If PrintDialog1.ShowDialog = DialogResult.OK Then PrintDocument1.DefaultPageSettings.Landscape = False ' orientation portrait PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings End If End Sub Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint Try strFormat = New StringFormat strFormat.Alignment = StringAlignment.Near strFormat.LineAlignment = StringAlignment.Center strFormat.Trimming = StringTrimming.EllipsisCharacter arrColumnLefts.Clear() arrColumnWidths.Clear() iCellHeight = 0 iCount = 0 bFirstPage = True bNewPage = True ' Calculating Total Widths iTotalWidth = 0 For Each dgvGridCol As DataGridViewColumn In dataGridView1.Columns iTotalWidth = (iTotalWidth + dgvGridCol.Width) Next Catch ex As Exception MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Try Dim iLeftMargin As Integer = e.MarginBounds.Left Dim iTopMargin As Integer = e.MarginBounds.Top Dim bMorePagesToPrint As Boolean = False Dim iTmpWidth As Integer = 0 Dim iRow As Integer Dim iHeaderHeight As Integer If bFirstPage Then For Each GridCol As DataGridViewColumn In dataGridView1.Columns iTmpWidth = CInt((Math.Floor(CDbl((CDbl(GridCol.Width) / CDbl(iTotalWidth) * CDbl(iTotalWidth) * (CDbl(e.MarginBounds.Width) / CDbl(iTotalWidth))))))) iHeaderHeight = CInt((e.Graphics.MeasureString(GridCol.HeaderText, GridCol.InheritedStyle.Font, iTmpWidth).Height)) + 11 arrColumnLefts.Add(iLeftMargin) arrColumnWidths.Add(iTmpWidth) iLeftMargin += iTmpWidth Next End If While iRow <= dataGridView1.Rows.Count - 1 Dim GridRow As DataGridViewRow = dataGridView1.Rows(iRow) iCellHeight = GridRow.Height + 5 Dim iCount As Integer = 0 If iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then bNewPage = True bFirstPage = False bMorePagesToPrint = True Exit While Else If bNewPage Then e.Graphics.DrawString("Customer Summary", New Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Customer Summary", New Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13) Dim strDate As String = DateTime.Now.ToLongDateString() & " " + DateTime.Now.ToShortTimeString() e.Graphics.DrawString(strDate, New Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, New Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Customer Summary", New Font(New Font(dataGridView1.Font, FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13) iTopMargin = e.MarginBounds.Top For Each GridCol As DataGridViewColumn In dataGridView1.Columns e.Graphics.FillRectangle(New SolidBrush(Color.LightGray), New Rectangle(CInt(arrColumnLefts(iCount)), iTopMargin, CInt(arrColumnWidths(iCount)), iHeaderHeight)) e.Graphics.DrawRectangle(Pens.Black, New Rectangle(CInt(arrColumnLefts(iCount)), iTopMargin, CInt(arrColumnWidths(iCount)), iHeaderHeight)) e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font, New SolidBrush(GridCol.InheritedStyle.ForeColor), New RectangleF(CInt(arrColumnLefts(iCount)), iTopMargin, CInt(arrColumnWidths(iCount)), iHeaderHeight), strFormat) iCount += 1 Next bNewPage = False iTopMargin += iHeaderHeight End If iCount = 0 For Each Cel As DataGridViewCell In GridRow.Cells If Cel.Value IsNot Nothing Then e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, New SolidBrush(Cel.InheritedStyle.ForeColor), New RectangleF(CInt(arrColumnLefts(iCount)), CSng(iTopMargin), CInt(arrColumnWidths(iCount)), CSng(iCellHeight)), strFormat) End If e.Graphics.DrawRectangle(Pens.Black, New Rectangle(CInt(arrColumnLefts(iCount)), iTopMargin, CInt(arrColumnWidths(iCount)), iCellHeight)) iCount += 1 Next End If iRow = iRow + 1 iTopMargin = iTopMargin + iCellHeight End While If bMorePagesToPrint Then e.HasMorePages = True Else e.HasMorePages = False End If Catch exc As Exception MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.[Error]) End Try End Sub
Merci pour l'attention que vous avez apporté à ma question et pour travail que cela vous a donné.
J'essaye ce nouveau code tout de suite.
Bon WE
Re,
Le code fonctionne parfaitement lorsque la longueur du datagridview n'excède pas la longueur d'une page. S'il dépasse la longueur d'une page on entre dans une boucle sans fin et le résultat de l'impression est une multitude de pages identiques à la première. Mais cela vient peut-être du programme initial. Je vais chercher du côté des boucles. Il y en a en effet plusieurs imbriquées les unes dans les autres et il est difficile d'y voir clair.
En tout ca merci pour votre aide.
26 janv. 2016 à 16:43
26 janv. 2016 à 16:56
Mon problème est résolu concernant ma boucle infinie. Mais maintenant mon problème c que mon DataGridView est mal organisé dans l'impression; Toutes les colonnes s'écrivent dans une seule colonne de tel sorte que l'écriture est combinée.
26 janv. 2016 à 18:59
On veut bien essayer de dépanner, mais pas faire de la voyance....
Si tu copies ce code dans un projet neuf, regarde tout ce qui se souligne en rouge, et reviens ici le décrire.
27 janv. 2016 à 09:19
Merci pour la réponse mais j'ai déclaré toutes les variables et je n'ai aucune erreur, rien n'est souligné en rouge. En plus j'ai résolu mon premier problème de boucle infini ; c'était juste une parenthèse mal placé dans la conversion.
Mon pèsent problème est que le DGV est mal organisé dans l'impression
Modifié par Whismeril le 27/01/2016 à 09:37
Je ne suis pas extralucide, donc pour trouver le bug, j'ai besoin de ces variables, sinon impossible de t'aider.