EDN Admin
Well-known member
Public Class Form1
Private Structure pageDetails
Dim columns As Integer
Dim rows As Integer
Dim startCol As Integer
Dim startRow As Integer
End Structure
<summary>
dictionary to hold printed page details, with index key
</summary>
<remarks></remarks>
Private pages As Dictionary(Of Integer, pageDetails)
Dim maxPagesWide As Integer
Dim maxPagesTall As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim clm1 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm1)
clm1.HeaderText = "MCA-2011"
clm1.Name = "clm1"
Dim clm2 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm2)
clm2.HeaderText = "semester4"
clm2.Name = "clm3"
DataGridView2.Columns(1).Width = 150
For j = 1 To 6
Dim clm3 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm3)
clm3.HeaderText = j.ToString
clm3.Name = "clm3"
DataGridView2.Columns(j + 1).Width = 140
Next
DataGridView2.Rows(1 - 1).HeaderCell.Value = 1.ToString
For i = 1 To 6
For j = 1 To 7
Dim clm As New DataGridViewTextBoxColumn()
DataGridView1.Columns.Add(clm)
clm.HeaderText = j.ToString
clm.Name = "clm"
Next
Next
For i = 1 To 100
Me.DataGridView1.Rows.Add("1", "2", "3", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1")
DataGridView1.Rows(i - 1).HeaderCell.Value = i.ToString
Next
For j As Integer = 2 To Me.DataGridView1.ColumnCount - 1
DataGridView1.Columns(j).Width = 20
Next
Me.DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
Me.DataGridView1.ColumnHeadersHeight = Me.DataGridView1.ColumnHeadersHeight * 2
Me.DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
End Sub
Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim ppd As New PrintPreviewDialog
ppd.Document = PrintDocument1
ppd.WindowState = FormWindowState.Maximized
ppd.ShowDialog()
End Sub
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
PrintDocument1.Print()
End Sub
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
this removes the printed page margins
PrintDocument1.OriginAtMargins = True
PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0, 0, 0, 0)
pages = New Dictionary(Of Integer, pageDetails)
MsgBox(pages.ToString)
Dim maxWidth As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) - 40
Dim maxHeight As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Height) - 40 + Label1.Height
Dim pageCounter As Integer = 0
pages.Add(pageCounter, New pageDetails)
Dim columnCounter As Integer = 0
Dim columnSum As Integer = DataGridView1.RowHeadersWidth
MsgBox(columnSum.ToString)
For c As Integer = 0 To DataGridView1.Columns.Count - 1
If columnSum + DataGridView1.Columns(c).Width < maxWidth Then
columnSum += DataGridView1.Columns(c).Width
columnCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
columnSum = DataGridView1.RowHeadersWidth + DataGridView1.Columns(c).Width
columnCounter = 1
pageCounter += 1
pages.Add(pageCounter, New pageDetails With {.startCol = c})
End If
If c = DataGridView1.Columns.Count - 1 Then
If pages(pageCounter).columns = 0 Then
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
End If
End If
Next
MsgBox(columnSum.ToString)
MsgBox(columnCounter.ToString)
maxPagesWide = pages.Keys.Max + 1
pageCounter = 0
Dim rowCounter As Integer = 0
Dim rowSum As Integer = DataGridView1.ColumnHeadersHeight
For r As Integer = 0 To DataGridView1.Rows.Count - 1
If rowSum + DataGridView1.Rows(r).Height < maxHeight Then
rowSum += DataGridView1.Rows(r).Height
rowCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = pages(pageCounter).columns, .rows = rowCounter, .startCol = pages(pageCounter).startCol, .startRow = pages(pageCounter).startRow}
For x As Integer = 1 To maxPagesWide - 1
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter).startRow}
Next
pageCounter += maxPagesWide
For x As Integer = 0 To maxPagesWide - 1
pages.Add(pageCounter + x, New pageDetails With {.columns = pages(x).columns, .rows = 0, .startCol = pages(x).startCol, .startRow = r})
Next
rowSum = DataGridView1.ColumnHeadersHeight + DataGridView1.Rows(r).Height
rowCounter = 1
End If
If r = DataGridView1.Rows.Count - 2 Then
For x As Integer = 0 To maxPagesWide - 1
If pages(pageCounter + x).rows = 0 Then
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter + x).startRow}
End If
Next
End If
Next
maxPagesTall = pages.Count maxPagesWide
End Sub
<summary>
this is the actual printing routine.
using the pagedetails i calculated earlier, it prints a title,
+ as much of the datagridview as will fit on 1 page, then moves to the next page.
this is setup to be dynamic. try resizing the dgv columns or rows
</summary>
<param name="sender </param>
<param name="e </param>
<remarks></remarks>
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim rect As New Rectangle(20, 20, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), Label1.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
e.Graphics.DrawString(Label1.Text, Label1.Font, Brushes.Black, rect, sf)
sf.Alignment = StringAlignment.Near
Dim startX1 As Integer = 50
Dim startY1 As Integer = 200 rect.Bottom
Static startPage1 As Integer = 0
For p As Integer = startPage1 To pages.Count - 1
Dim cell As New Rectangle(startX1, startY1, DataGridView1.RowHeadersWidth, DataGridView1.ColumnHeadersHeight)
Dim cell1 As New Rectangle(startX1 + 290, startY1 - 50, DataGridView1.RowHeadersWidth * 5 + 7, DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
Dim cell1 As New Rectangle(startX1, startY1 - 30, DataGridView2.RowHeadersWidth, DataGridView2.ColumnHeadersHeight)
For i = 0 To 7
cell1 = New Rectangle(startX1, startY1 - 30, DataGridView2.RowHeadersWidth, DataGridView2.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell1)
e.Graphics.DrawRectangle(Pens.Black, cell1)
e.Graphics.DrawString(DataGridView2.Columns(i).HeaderCell.Value.ToString, DataGridView2.Font, Brushes.Black, cell1, sf)
startX1 += DataGridView2.Columns(i).Width
Next
startX1 = 50
startY1 = 200 rect.Bottom
startY1 += DataGridView1.ColumnHeadersHeight
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
cell = New Rectangle(startX1, startY1, DataGridView1.RowHeadersWidth, DataGridView1.Rows(r).Height)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1.Rows(r).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startY1 += DataGridView1.Rows(r).Height
Next
startX1 += cell.Width
startY1 = 200 rect.Bottom
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX1, startY1, DataGridView1.Columns(c).Width, DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startX1 += DataGridView1.Columns(c).Width
Next
startY1 = 200 + DataGridView1.ColumnHeadersHeight rect.Bottom + DataGridView1.ColumnHeadersHeight
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
startX1 = 50 + DataGridView1.RowHeadersWidth
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX1, startY1, DataGridView1.Columns(c).Width, DataGridView1.Rows(r).Height)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1(c, r).Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startX1 += DataGridView1.Columns(c).Width
Next
startY1 += DataGridView1.Rows(r).Height
Next
If p <> pages.Count - 1 Then
startPage1 = p + 1
e.HasMorePages = True
Return
Else
startPage1 = 0
End If
Next
End Sub
please help me
how to split column level to row level in pages
View the full article
Private Structure pageDetails
Dim columns As Integer
Dim rows As Integer
Dim startCol As Integer
Dim startRow As Integer
End Structure
<summary>
dictionary to hold printed page details, with index key
</summary>
<remarks></remarks>
Private pages As Dictionary(Of Integer, pageDetails)
Dim maxPagesWide As Integer
Dim maxPagesTall As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim clm1 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm1)
clm1.HeaderText = "MCA-2011"
clm1.Name = "clm1"
Dim clm2 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm2)
clm2.HeaderText = "semester4"
clm2.Name = "clm3"
DataGridView2.Columns(1).Width = 150
For j = 1 To 6
Dim clm3 As New DataGridViewTextBoxColumn()
DataGridView2.Columns.Add(clm3)
clm3.HeaderText = j.ToString
clm3.Name = "clm3"
DataGridView2.Columns(j + 1).Width = 140
Next
DataGridView2.Rows(1 - 1).HeaderCell.Value = 1.ToString
For i = 1 To 6
For j = 1 To 7
Dim clm As New DataGridViewTextBoxColumn()
DataGridView1.Columns.Add(clm)
clm.HeaderText = j.ToString
clm.Name = "clm"
Next
Next
For i = 1 To 100
Me.DataGridView1.Rows.Add("1", "2", "3", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1", "2", "3", "2", "2", "2", "4", "2", "1")
DataGridView1.Rows(i - 1).HeaderCell.Value = i.ToString
Next
For j As Integer = 2 To Me.DataGridView1.ColumnCount - 1
DataGridView1.Columns(j).Width = 20
Next
Me.DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
Me.DataGridView1.ColumnHeadersHeight = Me.DataGridView1.ColumnHeadersHeight * 2
Me.DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
End Sub
Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim ppd As New PrintPreviewDialog
ppd.Document = PrintDocument1
ppd.WindowState = FormWindowState.Maximized
ppd.ShowDialog()
End Sub
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
PrintDocument1.Print()
End Sub
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
this removes the printed page margins
PrintDocument1.OriginAtMargins = True
PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0, 0, 0, 0)
pages = New Dictionary(Of Integer, pageDetails)
MsgBox(pages.ToString)
Dim maxWidth As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) - 40
Dim maxHeight As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Height) - 40 + Label1.Height
Dim pageCounter As Integer = 0
pages.Add(pageCounter, New pageDetails)
Dim columnCounter As Integer = 0
Dim columnSum As Integer = DataGridView1.RowHeadersWidth
MsgBox(columnSum.ToString)
For c As Integer = 0 To DataGridView1.Columns.Count - 1
If columnSum + DataGridView1.Columns(c).Width < maxWidth Then
columnSum += DataGridView1.Columns(c).Width
columnCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
columnSum = DataGridView1.RowHeadersWidth + DataGridView1.Columns(c).Width
columnCounter = 1
pageCounter += 1
pages.Add(pageCounter, New pageDetails With {.startCol = c})
End If
If c = DataGridView1.Columns.Count - 1 Then
If pages(pageCounter).columns = 0 Then
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
End If
End If
Next
MsgBox(columnSum.ToString)
MsgBox(columnCounter.ToString)
maxPagesWide = pages.Keys.Max + 1
pageCounter = 0
Dim rowCounter As Integer = 0
Dim rowSum As Integer = DataGridView1.ColumnHeadersHeight
For r As Integer = 0 To DataGridView1.Rows.Count - 1
If rowSum + DataGridView1.Rows(r).Height < maxHeight Then
rowSum += DataGridView1.Rows(r).Height
rowCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = pages(pageCounter).columns, .rows = rowCounter, .startCol = pages(pageCounter).startCol, .startRow = pages(pageCounter).startRow}
For x As Integer = 1 To maxPagesWide - 1
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter).startRow}
Next
pageCounter += maxPagesWide
For x As Integer = 0 To maxPagesWide - 1
pages.Add(pageCounter + x, New pageDetails With {.columns = pages(x).columns, .rows = 0, .startCol = pages(x).startCol, .startRow = r})
Next
rowSum = DataGridView1.ColumnHeadersHeight + DataGridView1.Rows(r).Height
rowCounter = 1
End If
If r = DataGridView1.Rows.Count - 2 Then
For x As Integer = 0 To maxPagesWide - 1
If pages(pageCounter + x).rows = 0 Then
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter + x).startRow}
End If
Next
End If
Next
maxPagesTall = pages.Count maxPagesWide
End Sub
<summary>
this is the actual printing routine.
using the pagedetails i calculated earlier, it prints a title,
+ as much of the datagridview as will fit on 1 page, then moves to the next page.
this is setup to be dynamic. try resizing the dgv columns or rows
</summary>
<param name="sender </param>
<param name="e </param>
<remarks></remarks>
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim rect As New Rectangle(20, 20, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), Label1.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
e.Graphics.DrawString(Label1.Text, Label1.Font, Brushes.Black, rect, sf)
sf.Alignment = StringAlignment.Near
Dim startX1 As Integer = 50
Dim startY1 As Integer = 200 rect.Bottom
Static startPage1 As Integer = 0
For p As Integer = startPage1 To pages.Count - 1
Dim cell As New Rectangle(startX1, startY1, DataGridView1.RowHeadersWidth, DataGridView1.ColumnHeadersHeight)
Dim cell1 As New Rectangle(startX1 + 290, startY1 - 50, DataGridView1.RowHeadersWidth * 5 + 7, DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
Dim cell1 As New Rectangle(startX1, startY1 - 30, DataGridView2.RowHeadersWidth, DataGridView2.ColumnHeadersHeight)
For i = 0 To 7
cell1 = New Rectangle(startX1, startY1 - 30, DataGridView2.RowHeadersWidth, DataGridView2.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell1)
e.Graphics.DrawRectangle(Pens.Black, cell1)
e.Graphics.DrawString(DataGridView2.Columns(i).HeaderCell.Value.ToString, DataGridView2.Font, Brushes.Black, cell1, sf)
startX1 += DataGridView2.Columns(i).Width
Next
startX1 = 50
startY1 = 200 rect.Bottom
startY1 += DataGridView1.ColumnHeadersHeight
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
cell = New Rectangle(startX1, startY1, DataGridView1.RowHeadersWidth, DataGridView1.Rows(r).Height)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1.Rows(r).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startY1 += DataGridView1.Rows(r).Height
Next
startX1 += cell.Width
startY1 = 200 rect.Bottom
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX1, startY1, DataGridView1.Columns(c).Width, DataGridView1.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1.Columns(c).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startX1 += DataGridView1.Columns(c).Width
Next
startY1 = 200 + DataGridView1.ColumnHeadersHeight rect.Bottom + DataGridView1.ColumnHeadersHeight
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
startX1 = 50 + DataGridView1.RowHeadersWidth
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX1, startY1, DataGridView1.Columns(c).Width, DataGridView1.Rows(r).Height)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView1(c, r).Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startX1 += DataGridView1.Columns(c).Width
Next
startY1 += DataGridView1.Rows(r).Height
Next
If p <> pages.Count - 1 Then
startPage1 = p + 1
e.HasMorePages = True
Return
Else
startPage1 = 0
End If
Next
End Sub
please help me
how to split column level to row level in pages
View the full article