Here is my code:
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Data
Imports System.Data.OleDb
Public Class Form3
Dim dgv As New DataGridView()
Dim print As New PrintDocument()
Dim preview As New PrintPreviewDialog()
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim con As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source=C:\Users\user\Documents\Inventory\InventoryLogin\InventoryLogin\Supplies.mdb")
Try
con.Open()
Dim sql As String
sql = "SELECT * From [product info]"
Dim adapter As New OleDbDataAdapter(sql, con)
Dim dt As New DataTable("product info")
adapter.Fill(dt)
preview.PrintPreviewControl.Zoom = 1
preview.Document = print
preview.Show()
AddHandler print.PrintPage, AddressOf print_PrintPage
Catch Ex As Exception
MessageBox.Show(Ex.Message)
End Try
End Sub
Protected Sub print_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim ColumnCount As Integer = dgv.ColumnCount
Dim RowCount As Integer = dgv.RowCount
Dim CellTopPos As Integer = print.PrinterSettings.DefaultPageSettings.Margins.Top
For Row = 0 To RowCount - 2
Dim CellLeftPos As Integer = print.PrinterSettings.DefaultPageSettings.Margins.Left
For Cell = 0 To ColumnCount - 1
Dim CellValue As String = dgv.Rows(Row).Cells(Cell).Value.ToString()
Dim CellWidth = dgv.Rows(Row).Cells(Cell).Size.Width + 10
Dim CellHeight = dgv.Rows(Row).Cells(Cell).Size.Height
Dim Brush As New SolidBrush(Color.Black)
e.Graphics.DrawString(CellValue, New Font("tahoma", 10), Brush, CellLeftPos, CellTopPos)
e.Graphics.DrawRectangle(Pens.Black, CellLeftPos, CellTopPos, CellWidth, CellHeight)
CellLeftPos += CellWidth
Next
CellTopPos += dgv.Rows(Row).Cells(0).Size.Height
Next
End Sub
End Class
I am trying to preview and print the items in my datagridview in vb.net
The user needs to click the "Print Preview" button to view the document before printing it, but when i click the button it just shows an empty page. How can i make the records in the datagridview appear in my preview page?
I removed the Dim dgv As New DataGridView and replaced with the name of the current DataGridView.
Related
The following code isn't working when exporting the datagridview data when trying to make it vertical with headers along the left side along with text beside each one. Once this is flipped the user would click on button1 to export to excel.
Imports System.Data.DataTable
Imports System.IO
Imports Microsoft.Office.Interop
Public Class Form1
Dim table As New DataTable(0)
Public checkBoxList As List(Of CheckBox)
Private ds As DataSet = Nothing
Private dt As DataTable = Nothing
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ds = New DataSet()
dt = New DataTable()
ds.Tables.Add("Table")
Dim my_DataView As DataView = ds.Tables(0).DefaultView
DataGridView1.DataSource = my_DataView
table.Columns.Add("Forename", Type.GetType("System.String"))
table.Columns.Add("Surname", Type.GetType("System.String"))
table.Columns.Add("Food", Type.GetType("System.String"))
checkBoxList = New List(Of CheckBox) From {CheckBox1, CheckBox2, CheckBox3, CheckBox4}
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
Dim values As String = "" &
String.Join(" & ", checkBoxList _
.Where(Function(cb) cb.Checked).Select(Function(cb) cb.Text))
' use values for placing into your DataGridView
CheckBox1.Text = values
CheckBox2.Text = values
CheckBox3.Text = values
CheckBox4.Text = values
table.Rows.Add(TextBox1.Text, TextBox2.Text, values.ToString)
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
DataGridView1.RowTemplate.Height = 100
DataGridView1.AllowUserToAddRows = False
DataGridView1.DataSource = table
'Save to excel with headers
Dim ExcelApp As Object, ExcelBook As Object
Dim ExcelSheet As Object
Dim i As Integer
Dim j As Integer
'create object of excel
ExcelApp = CreateObject("Excel.Application")
ExcelBook = ExcelApp.WorkBooks.Add
ExcelSheet = ExcelBook.WorkSheets(1)
With ExcelSheet
For Each column As DataGridViewColumn In DataGridView1.Columns
.cells(1, column.Index + 1) = column.HeaderText
Next
For i = 1 To Me.DataGridView1.RowCount
.cells(i + 1, 1) = Me.DataGridView1.Rows(i - 1).Cells("Forename").Value
For j = 1 To DataGridView1.Columns.Count - 1
.cells(i + 1, j + 1) = DataGridView1.Rows(i - 1).Cells(j).Value
Next
Next
End With
ExcelApp.Visible = True
'
ExcelSheet = Nothing
ExcelBook = Nothing
ExcelApp = Nothing
End Sub
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
End Sub
Public Function FlipDataSet(ByVal my_DataSet As DataSet) As DataSet
Dim ds As New DataSet()
For Each dt As DataTable In my_DataSet.Tables
Dim table As New DataTable()
For i As Integer = 0 To dt.Rows.Count
table.Columns.Add(Convert.ToString(i))
Next
Dim r As DataRow
For k As Integer = 0 To dt.Columns.Count - 1
r = table.NewRow()
r(0) = dt.Columns(k).ToString()
For j As Integer = 1 To dt.Rows.Count
r(j) = dt.Rows(j - 1)(k)
Next
table.Rows.Add(r)
Next
ds.Tables.Add(table)
Next
Return ds
End Function
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
Dim currentDataView As DataView = currentDataSet.Tables(0).DefaultView
DataGridView1.DataSource = currentDataView
Button2.Enabled = False
End Sub
End Class
When clicking button2 it should flip the data with the following;
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles
Button2.Click
Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
Dim currentDataView As DataView = currentDataSet.Tables(0).DefaultView
DataGridView1.DataSource = currentDataView
Button2.Enabled = False
End Sub
End Class
I've tried debugging but it i can't seem to find anything wrong? It will allow me to insert data in the textbox's whilst selecting checkbox's and when clicking button 1 to export it works fine, but it doesn't flip the data.
Please can anyone suggest how to fix this as i have a presentation on the 8th June and this data needs to automatically be flipped
Sourcecode: Download Myproject
Image of target
Answered:
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices
Public Class Form1
Private ds As DataSet = Nothing
Private dt As DataTable = Nothing
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.AllowUserToAddRows = False
dt = New DataTable("MyTable")
dt.Columns.Add("Forename", Type.GetType("System.String"))
dt.Columns.Add("Surname", Type.GetType("System.String"))
dt.Columns.Add("Food", Type.GetType("System.String"))
ds = New DataSet
ds.Tables.Add(dt)
Dim my_DataView As DataView = ds.Tables("MyTable").DefaultView
DataGridView1.DataSource = my_DataView
End Sub
Private Sub Button_AddRowData_Click(sender As Object, e As EventArgs) Handles Button_AddRowData.Click
Dim foods As String = String.Join(" & ", CheckedListBox1.CheckedItems.Cast(Of String))
dt.Rows.Add(New Object() {TextBox_Forename.Text, TextBox_Surname.Text, foods})
End Sub
Private Sub Button_FlipAndSave_Click(sender As Object, e As EventArgs) Handles Button_FlipAndSave.Click
FlipAndSave(ds.Tables("MyTable"))
End Sub
Private Sub FlipAndSave(table As DataTable)
Dim ExcelApp As New Excel.Application
Dim WrkBk As Excel.Workbook = ExcelApp.Workbooks.Add()
Dim WrkSht As Excel.Worksheet = CType(WrkBk.Worksheets(1), Excel.Worksheet)
With WrkSht
For ci As Integer = 0 To table.Columns.Count - 1
.Cells(ci + 1, 1) = table.Columns(ci).ColumnName
Next
For ri As Integer = 0 To table.Rows.Count - 1
For ci As Integer = 0 To table.Columns.Count - 1
.Cells(ci + 1, ri + 2) = table.Rows(ri).Item(ci).ToString
Next
Next
End With
ExcelApp.Visible = True
'use this lines if you want to automatically save the WorkBook
'WrkBk.SaveAs("C:\Some Folder\My Workbook.xlsx") '(.xls) if you have an old version of Excel
'ExcelApp.Quit() 'use this line if you want to close the Excel Application
ReleaseObject(ExcelApp)
ReleaseObject(WrkBk)
ReleaseObject(WrkSht)
End Sub
Private Sub ReleaseObject(obj As Object)
Marshal.ReleaseComObject(obj)
obj = Nothing
End Sub
End Class
I am having an issue with filling a DataGridView from an Excel file that is online. On button click, the app should create a new tab, add a DataGridView and populate with values from the Excel file. How can I do it?
Here is what I did so far:
Public Class Form1
Dim tempTabExist = False
Private Sub SiteList_Click(sender As Object, e As EventArgs) Handles SiteList.Click
Dim xlApp As Excel.Application
Dim wkbTemplRaspored As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
If tempTabExist = False Then
Call CreateNewTabPage()
End If
xlApp = New Excel.Application
xlApp.Visible = True
wkbTemplRaspored = xlApp.Workbooks.Open("http://CRNO/RAN/Raspored%20R%20A%20N_v1.xlsx")
xlWorkSheet = wkbTemplRaspored.Worksheets("Sheet1")
End Sub
Private Sub CreateNewTabPage()
Dim tp As New TabPage
tempTabExist = True
tp.Name = "SiteList"
tp.Text = "SiteList"
Call CreateNewGrid(tp)
Me.TabControl.TabPages.Add(tp)
End Sub
Private Sub CreateNewGrid(ByRef TP As TabPage)
Dim dg As New DataGridView
dg.Dock = DockStyle.Fill
dg.Name = "Raspored"
dg.Columns.Add(dg.Name, "Site Name")
dg.Columns.Add(dg.Name, "Technology")
dg.Columns.Add(dg.Name, "Week")
dg.Columns.Add(dg.Name, "Engineer")
TP.Controls.Add(dg)
End Sub
End Class
Most of your code seems to be working. I would change a few things however apart from listing the data in your DataGridView the code does appear to work.
To retrieve data from Excel and view in a DataGridView I would look at the following code:
Using con As New Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Test.xlsx'; Extended Properties='Excel 12.0;';"),
com As Data.OleDb.OleDbCommand = con.CreateCommand()
con.Open()
Dim dtSheetName As DataTable
dtSheetName = con.GetSchema("Tables")
If dtSheetName.Rows.Count > 0 Then
com.CommandText = "select * from [" & dtSheetName.Rows(0)("TABLE_NAME").ToString() & "]"
com.CommandType = CommandType.Text
dtRows.Load(com.ExecuteReader())
End If
End Using
There are bits of code here you may need to change as I haven't tested with your Data Source. Instead I used my own.
I would look at changing your method CreateNewTabPage slightly to return a TabPage:
Private Function CreateNewTabPage() As TabPage
Dim tp As New TabPage
tp.Name = "SiteList"
tp.Text = "SiteList"
Return tp
End Function
Instead of calling CreateNewGrid from CreateNewTabPage I would do this on your button click. I would however pass through the DataTable as well as the TabPage.
Additionally since we are assigning a DataTable as the DataSource we don't need to add columns manually. Here is what I would do:
Private Sub CreateNewGrid(ByRef TP As TabPage,
ByVal dt As DataTable)
Dim dg As New DataGridView
dg.Dock = DockStyle.Fill
dg.Name = "Raspored"
dg.DataSource = dt
TP.Controls.Add(dg)
End Sub
This is how I would call both methods:
If dtRows.Rows.Count > 0 Then
Dim tabPage As TabPage = CreateNewTabPage()
If tabPage IsNot Nothing Then
If TabControl1.TabPages.ContainsKey(tabPage.Name) Then
TabControl1.TabPages.RemoveByKey(tabPage.Name)
End If
CreateNewGrid(tabPage, dtRows)
TabControl1.TabPages.Add(tabPage)
End If
End If
Notice that I check for the tab and should it exist, I remove it. You may want to do something similar.
All together your code would look something like this:
Private Sub SiteList_Click(sender As Object, e As EventArgs) Handles SiteList.Click
Dim dtRows As New DataTable
Using con As New Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='http://CRNO/RAN/Raspored%20R%20A%20N_v1.xlsx'; Extended Properties='Excel 12.0;';"),
com As Data.OleDb.OleDbCommand = con.CreateCommand()
con.Open()
Dim dtSheetName As DataTable
dtSheetName = con.GetSchema("Tables")
If dtSheetName.Rows.Count > 0 Then
com.CommandText = "select * from [" & dtSheetName.Rows(0)("TABLE_NAME").ToString() & "]"
com.CommandType = CommandType.Text
dtRows.Load(com.ExecuteReader())
End If
End Using
If dtRows.Rows.Count > 0 Then
Dim tabPage As TabPage = CreateNewTabPage()
If tabPage IsNot Nothing Then
If TabControl1.TabPages.ContainsKey(tabPage.Name) Then
TabControl1.TabPages.RemoveByKey(tabPage.Name)
End If
CreateNewGrid(tabPage, dtRows)
TabControl1.TabPages.Add(tabPage)
End If
End If
End Sub
Private Function CreateNewTabPage() As TabPage
Dim tp As New TabPage
tp.Name = "SiteList"
tp.Text = "SiteList"
Return tp
End Function
Private Sub CreateNewGrid(ByRef TP As TabPage,
ByVal dt As DataTable)
Dim dg As New DataGridView
dg.Dock = DockStyle.Fill
dg.Name = "Raspored"
dg.DataSource = dt
TP.Controls.Add(dg)
End Sub
If you haven't already you may need to download Microsoft Access Database Engine 2010 Redistributable.
There are several ways to do this. Here are two ideas for you to muse over.
Imports System.Data.SqlClient
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim DtSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Users\Excel\Desktop\Book1.xls';Extended Properties=Excel 8.0;")
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Net-informations.com")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)
DataGridView1.DataSource = DtSet.Tables(0)
MyConnection.Close()
End Sub
End Class
Also, try this.
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Data.OleDb
'~~> Define your Excel Objects
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim xlApp As New Excel.Application
'Dim xlWorkBook As Excel.Workbook
'Dim xlWorkSheet As Excel.Worksheet
Dim strConn As String
Dim da As OleDbDataAdapter
Dim ds As New DataSet
Dim dao_dbE As dao.DBEngine
Dim dao_DB As DAO.Database
Dim strFirstSheetName As String
dao_dbE = New dao.DBEngine
dao_DB = dao_dbE.OpenDatabase("C:\Users\Excel\Desktop\Coding\DOT.NET\Samples VB\Import into DataGrid from Excel & Export from DataGrid to Excel #2\Book3.xls", False, True, "Excel 8.0;")
strFirstSheetName = dao_DB.TableDefs(0).Name
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Users\Excel\Desktop\Coding\DOT.NET\Samples VB\Import into DataGrid from Excel & Export from DataGrid to Excel #2\Book3.xls;Extended Properties=""Excel 8.0;"""
da = New OleDbDataAdapter("SELECT * FROM [" & _
strFirstSheetName & "]", strConn)
da.TableMappings.Add("Table", "Excel")
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0).DefaultView
da.Dispose()
dao_DB.Close()
End Sub
End Class
I'm using a MySql database with 2 fields: a dossiernumber and a field where I save the name and location of a image. I want to place a datagrid on my winform and show a image (thumbnail) in the first cell and the dossiernumber in the second cell, but can't get it working.
The pictures don't show and leave only missing picture link. I also can't place the picture in the first cell. This is what it looks like:
What is wrong?
This is the code I've written:
Imports MySql.Data.MySqlClient
Public Class Form1
'ALLES OM DATAGRID TE PLAATSEN
'GLOBALE DECLARATIES
Dim conString As String = "server=localhost;userid=root;database=testvehicle"
Dim con As New MySqlConnection(conString)
Dim cmd As MySqlCommand
Dim adapter As MySqlDataAdapter
Dim dt As New DataTable()
Private Sub Form1_GotFocus(sender As Object, e As EventArgs) Handles Me.GotFocus
retrieve()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.ColumnCount = 2
DataGridView1.Width = 410
'CONSTRUCT IMAGE COLUMN
Dim imgCol As DataGridViewImageColumn = New DataGridViewImageColumn()
DataGridView1.Columns(0).Name = "Image"
DataGridView1.Columns.Add(imgCol)
'CONSTRUCT DATA COLUMNS
DataGridView1.Columns(1).Name = "dossiernr"
DataGridView1.Columns(1).Width = 100
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullColumnSelect
End Sub
'ALLES OM DATAGRID TE VULLEN
'PROCEDURE POPULATE ROW
Private Sub populate(foto1 As String, product_dossiernr As String)
Dim row As String() = New String() {foto1, product_dossiernr}
'ADD ROW TO ROWS
DataGridView1.Rows.Add(row)
End Sub
'DATA ONTVANGEN
Private Sub retrieve()
DataGridView1.Rows.Clear()
'SQL STATEMENT
Dim sql As String = "SELECT foto1, product_dossiernr FROM producten ORDER BY product_dossiernr"
cmd = New MySqlCommand(sql, con)
'OPEN CON, RETRIEVE, FILL DATAGRID
Try
con.Open()
adapter = New MySqlDataAdapter(cmd)
adapter.Fill(dt)
For Each row In dt.Rows
populate(row(0), row(1))
Next
con.Close()
dt.Rows.Clear()
Catch ex As Exception
MsgBox(ex.Message)
con.Close()
End Try
End Sub
'EINDE DATAGRID VULLEN
End Class
in your code it looks like your naming your column the image name, not assigning it a picture value so this is why your getting the name and not the image.
here is s snippet of code I used before that works pretty well.
Dim ColImage As New DataGridViewImageColumn
Dim Img As New DataGridViewImageCell
'Set Name
ColImage.Name = "ColImg"
'Set Header text
ColImage.HeaderText = "Your Image!"
'Add column to datagridview
DataGridView1.Columns.Add(ColImage)
'Set image value
Img.Value = Image.FromFile("C:\YourImage.png")
'Add the image cell to a row
DataGridView1.Rows(0).Cells.Add(Img)
I have a report that I need to print after a sale has completed.
I am having issues with the length and printing when using PrintForm and PrintDocument components however if I right click and select Print from the list the report prints perfectly.
Is there any way that I could write code in my form load event that would imitate the right click print?
Ive been struggling with this part of my project for ages now and the whole thing is now way behind schedule.
My Code for the whole Receipt form page is:
Imports System.Data.OleDb
Imports System.IO
Imports System.Drawing.Printing
Public Class Receipt
Public PicLocation As String
Dim Ctrl1, Ctrl2 As Control
Dim CN As New OleDb.OleDbConnection
Dim CMD As New OleDb.OleDbCommand
Dim DataR As OleDb.OleDbDataReader
'To display into datagrid purpose
Dim dataS As New DataSet
Dim dataAd As New OleDb.OleDbDataAdapter
Public SqlStr, SqlStr1, DBPath, DBStatus, SearchBox As String
Dim X, Y, SqlH, Onh As Integer
Dim SqlUser As String
Dim DataP As Decimal
Dim Balance As Integer
Private Sub Receipt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'ProductListDataSet' table.
DBPath = (Application.StartupPath & "\ProductList.accdb")
If CN.State = ConnectionState.Open Then
CN.Close()
DBStatus = ("Not Connected")
End If
SqlStr = ("Provider = Microsoft.ACE.OLEDB.12.0;Data Source =" & DBPath)
CN.ConnectionString = SqlStr
CN.Open()
Onh = Nothing
lblTime.Text = DateAndTime.Now
lblUser.Text = Login.userTB.Text
Dim sql As String
sql = "SELECT * Receipt"
Me.ReceiptTableAdapter.ClearBeforeFill = True
Me.ReceiptTableAdapter.Connection = CN
Me.ReceiptTableAdapter.Connection.CreateCommand.CommandText = sql
Me.ReceiptTableAdapter.Fill(Me.ProductListDataSet.Receipt)
Me.ReportViewer1.RefreshReport()
Me.Refresh()
End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
With Me.PrintForm1
.PrintAction = Printing.PrintAction.PrintToPrinter
Dim MyMargins As New Margins
With MyMargins
.Left = 0
.Right = 0
.Top = 0
.Bottom = 0
End With
.PrinterSettings.DefaultPageSettings.Margins = MyMargins
.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.CompatibleModeClientAreaOnly)
End With
End Sub
End Class
Im trying to print the contents of my datagridview to a legal or long size bond paper but i can't find the code to make the paper in preview dialog to long. Here is my code for print preview and print:
Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim strcon As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source=C:\Users\user\Documents\Visual Studio 2008\Projects\NMGInventory\NMGInventory\Supplies.mdb")
Try
strcon.Open()
Dim sql As String
sql = "SELECT * From [product info]"
Dim adapter As New OleDbDataAdapter(sql, strcon)
Dim dt As New DataTable("product info")
adapter.Fill(dt)
print.DefaultPageSettings.Landscape = True
.
preview.PrintPreviewControl.Zoom = 1
preview.Document = print
preview.Show()
AddHandler print.PrintPage, AddressOf print_PrintPage
strcon.Close()
Catch Ex As Exception
MessageBox.Show(Ex.Message)
End Try
End Sub
Protected Sub print_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
Dim ColumnCount As Integer = DataGridView1.ColumnCount
Dim RowCount As Integer = DataGridView1.RowCount
Dim CellTopPos As Integer = print.PrinterSettings.DefaultPageSettings.Margins.Top
For Row = 0 To RowCount - 1
Dim CellLeftPos As Integer = print.PrinterSettings.DefaultPageSettings.Margins.Left
Dim CellRightPos As Integer = print.PrinterSettings.DefaultPageSettings.Margins.Right
For Cell = 0 To ColumnCount - 1
Dim CellValue As String = DataGridView1.Rows(Row).Cells(Cell).Value.ToString()
Dim CellWidth = DataGridView1.Rows(Row).Cells(Cell).Size.Width + 50
Dim CellHeight = DataGridView1.Rows(Row).Cells(Cell).Size.Height
Dim CellWidth1 = DataGridView1.Rows(3).Cells(Cell).Size.Width + -30
Dim Brush As New SolidBrush(Color.Black)
e.Graphics.DrawString(CellValue, New Font("Century Gothic", 10), Brush, CellLeftPos, CellTopPos)
e.Graphics.DrawRectangle(Pens.Black, CellLeftPos, CellTopPos, CellWidth, CellHeight)
CellLeftPos += CellWidth
Next
CellTopPos += DataGridView1.Rows(Row).Cells(0).Size.Height
Next
End Sub
Set the following setting
Dim xCustomSize As New PaperSize("Legal", 850, 1400)
Me.DefaultPageSettings.PaperSize = xCustomSize