Как расположить печатный datagridview
Я искал код, который импортирует и печатает DataGridView, и я его нашел. Моя цель-создать биллинговую систему для юридической фирмы. Я напечатал имя юриста, адрес и т. д., И после этого я хочу распечатать datagridview счета, но проблема в том, что vb печатает его поверх информации юриста. моя цель-распечатать gatagridview под информацией об адвокате . в интернете было такое решение как:
e.Graphics.DrawRectangle(blackPen, New Rectangle(position, yPosition, totalWidth, height))Я очень старался реализовать его в коде но это не сработало пожалуйста помогите
вот этот код:
Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage 'lawyer info e.Graphics.DrawString("Facture", New Font("Arial", 24, FontStyle.Italic), Brushes.Blue, New Point(200, 20)) e.Graphics.DrawString("Nom Avocat : " + TextBox17.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 60)) e.Graphics.DrawString("Adresse : " + TextBox18.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 80)) e.Graphics.DrawString("Ville : " + TextBox19.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 100)) e.Graphics.DrawString("Telephone : " + TextBox20.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 120)) e.Graphics.DrawString("Email : " + TextBox21.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 140)) e.Graphics.DrawString("Site web : " + TextBox22.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 160)) e.Graphics.DrawString("Site web : " + TextBox22.Text, New Font("Arial", 12, FontStyle.Italic), Brushes.Black, New Point(20, 180)) 'positioning of datagriview2 'insert datagridview ' sets it to show '...' for long text Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit) fmt.LineAlignment = StringAlignment.Center fmt.Trimming = StringTrimming.EllipsisCharacter Dim y As Int32 = e.MarginBounds.Top Dim rc As Rectangle Dim x As Int32 Dim h As Int32 = 0 Dim row As DataGridViewRow ' print the header text for a new page ' use a grey bg just like the control If newpage Then row = DataGridView2.Rows(mRow) x = e.MarginBounds.Left For Each cell As DataGridViewCell In row.Cells ' since we are printing the control's view, ' skip invidible columns If cell.Visible Then rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height) e.Graphics.FillRectangle(Brushes.LightGray, rc) e.Graphics.DrawRectangle(Pens.Black, rc) ' reused in the data pront - should be a function Select Case DataGridView2.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment Case DataGridViewContentAlignment.BottomRight, DataGridViewContentAlignment.MiddleRight fmt.Alignment = StringAlignment.Far rc.Offset(-1, 0) Case DataGridViewContentAlignment.BottomCenter, DataGridViewContentAlignment.MiddleCenter fmt.Alignment = StringAlignment.Center Case Else fmt.Alignment = StringAlignment.Near rc.Offset(2, 0) End Select e.Graphics.DrawString(DataGridView2.Columns(cell.ColumnIndex).HeaderText, DataGridView2.Font, Brushes.Black, rc, fmt) x += rc.Width h = Math.Max(h, rc.Height) End If Next y += h End If newpage = False ' now print the data for each row Dim thisNDX As Int32 For thisNDX = mRow To DataGridView2.RowCount - 1 ' no need to try to print the new row If DataGridView2.Rows(thisNDX).IsNewRow Then Exit For row = DataGridView2.Rows(thisNDX) x = e.MarginBounds.Left h = 0 ' reset X for data x = e.MarginBounds.Left ' print the data For Each cell As DataGridViewCell In row.Cells If cell.Visible Then rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height) ' SAMPLE CODE: How To ' up a RowPrePaint rule 'If Convert.ToDecimal(row.Cells(5).Value) < 9.99 Then ' Using br As New SolidBrush(Color.MistyRose) ' e.Graphics.FillRectangle(br, rc) ' End Using 'End If e.Graphics.DrawRectangle(Pens.Black, rc) Select Case DataGridView2.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment Case DataGridViewContentAlignment.BottomRight, DataGridViewContentAlignment.MiddleRight fmt.Alignment = StringAlignment.Far rc.Offset(-1, 0) Case DataGridViewContentAlignment.BottomCenter, DataGridViewContentAlignment.MiddleCenter fmt.Alignment = StringAlignment.Center Case Else fmt.Alignment = StringAlignment.Near rc.Offset(2, 0) End Select e.Graphics.DrawString(cell.FormattedValue.ToString(), DataGridView2.Font, Brushes.Black, rc, fmt) x += rc.Width h = Math.Max(h, rc.Height) End If Next y += h ' next row to print mRow = thisNDX + 1 If y + h > e.MarginBounds.Bottom Then e.HasMorePages = True ' mRow -= 1 causes last row to rePrint on next page newpage = True Return End If Next ' end instert End Sub
Что я уже пробовал:
e.Graphics.DrawRectangle(blackPen, New Rectangle(position, yPosition, totalWidth, height))
Richard MacCutchan
Не используйте фиксированное значение для позиции, на которой вы печатаете. Начните с верхнего левого положения страницы для первого элемента и вычислите положение каждого следующего элемента по размеру и положению его предшественника.