Click here to Skip to main content
15,394,559 members
Articles / Programming Languages / C#
Posted 15 May 2011

Tagged as


44 bookmarked

How to Print Invoice using C#?

Rate me:
Please Sign up or sign in to vote.
4.58/5 (31 votes)
15 May 2011CPOL1 min read
This is a trial to print Invoice with C#



How to use C# to print Invoice? This is a trial to print Invoice with C#.

You can read another article (How to use VB.NET to print Invoice?).

My project has three forms:

  • frmInvoice: to bind DataGrid with all Orders from Northwind database file
  • frmInput: to choose one Order which you want to print its Invoice
  • frmOrder: to display Invoice on DataGrid, then you can Print Preview or Print the Invoice as Report

Also, we need three classes for printing:

  • System.Windows.Forms.PrintDialog
  • System.Windows.Forms.PrintPreviewDialog
  • System.Drawing.Printing.PrintDocument

Of course, you can use any database file instead of Northwind.mdb and change my code to connect with your database file, also you can change my SQL string to bind DataGrid with data.

Using the Code

Bind the DataGrid in frmInvoice form with all Orders:

// following lines to connect with access database file 'Northwind.mdb'
string MyPass = "";
string MyDataFile = Application.StartupPath + @"\DataFile\Northwind.mdb";
string strCon = @"provider=microsoft.jet.oledb.4.0;data source=" +
  MyDataFile + ";" + "Jet OLEDB:Database Password=" + MyPass + ";";

// If you are using SQL Server, please replace previous lines with following:
 string strCon = @"provider=sqloledb;Data Source=PC;Initial Catalog=" +
   "Northwind;Integrated Security=SSPI" + ";";
// and replace 'Data Source=PC' with the name of your system 

   // Get data from tables: Orders, Customers, Employees, Products, Order Details:
   string InvSql = "SELECT Customers.CompanyName, Customers.City, " +
    "Employees.FirstName + Space(1) + Employees.LastName AS Salesperson, " +
    "Orders.OrderID, Orders.OrderDate, " +
    "[Order Details].ProductID, Products.ProductName, [Order Details].UnitPrice, " +
    "[Order Details].Quantity, [Order Details].Discount, "+
    "CCur([Order Details].UnitPrice*[Quantity]*(1-[Discount])/100)*100 
	AS ExtendedPrice, " +
    "Orders.Freight " +
    "FROM Products INNER JOIN ((Employees INNER JOIN " +
    "(Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) " +
    "ON Employees.EmployeeID = Orders.EmployeeID) " +
    "INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) " +
    "ON Products.ProductID = [Order Details].ProductID;";

   // create an OleDbDataAdapter
   OleDbDataAdapter datAdp = new OleDbDataAdapter(InvSql, strCon);

   // create a command builder
   OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(datAdp);

   // create a DataTable to hold the query results
   DataTable dTable = new DataTable;

   // fill the DataTable

   // set DataSource of DataGrid 
   datGrid.DataSource = dTable;
catch (Exception e)

Bind the DataGrid in frmOrder form with one Order:

// Declare 'InvoiceOrder' in 'clsGlobal' class, 
//'InvoiceOrder' is the number of Order which you select:
int intOrder = int.Parse(clsGlobal.InvoiceOrder);
string MyDataFile = Application.StartupPath + @"\DataFile\Northwind.mdb";
string MyPass = "";
dtring strCon = "provider=microsoft.jet.oledb.4.0;data source=" +
 MyDataFile + ";" + "Jet OLEDB:Database Password=" + MyPass + ";";

   // Get Invoice Data:
   InvSql = "SELECT [Order Details].ProductID, " +
    "Products.ProductName, [Order Details].UnitPrice, " +
    "[Order Details].Quantity, [Order Details].Discount, " +
    "CCur([Order Details].UnitPrice*[Quantity]*(1-[Discount])/100)*100 " +
    "AS ExtendedPrice " +
    "FROM Products INNER JOIN [Order Details] " +
    "ON Products.ProductID=[Order Details].ProductID " +
    "WHERE [Order Details].OrderID = " + intOrder;

   // create an OleDbDataAdapter
   OleDbDataAdapter datAdp = new OleDbDataAdapter(InvSql, strCon);

   // create a command builder
   OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(datAdp);

   // create a DataTable to hold the query results
   DataTable dTable = new DataTable;

   // fill the DataTable

   // Create a TableStyle to format Datagrid columns.
   DataGridTableStyle tableStyle = new DataGridTableStyle;

   foreach (DataColumn dc in dTable.Columns)
      DataGridTextBoxColumn txtColumn = new DataGridTextBoxColumn;
      txtColumn.MappingName = dc.ColumnName;
      txtColumn.HeaderText = dc.Caption;
      switch (dc.ColumnName.ToString())
         case "ProductID": // Product ID 
            txtColumn.HeaderText = "Product ID";
            txtColumn.Width = 60;
         case "ProductName": // Product Name 
            txtColumn.HeaderText = "Product Name";
            txtColumn.Width = 110;
         case "UnitPrice": // Unit Price 
            txtColumn.HeaderText = "Unit Price";
            txtColumn.Format = "0.00";
            txtColumn.Alignment = HorizontalAlignment.Right;
            txtColumn.Width = 60;
         case "Discount": // Discount 
            txtColumn.HeaderText = "Discount";
            txtColumn.Format = "p"; // percent
            txtColumn.Alignment = HorizontalAlignment.Right;
            txtColumn.Width = 60;
         case "Quantity": // Quantity 
            txtColumn.HeaderText = "Quantity";
            txtColumn.Alignment = HorizontalAlignment.Right;
             txtColumn.Width = 50;
         case "ExtendedPrice": // Extended Price 
            txtColumn.HeaderText = "Extended Price";
            txtColumn.Format = "0.00";
            txtColumn.Alignment = HorizontalAlignment.Right;
            txtColumn.Width = 90;

   tableStyle.MappingName = dTable.TableName;
   // set DataSource of DataGrid 
   ordGrid.DataSource = dTable.DefaultView;
catch (Exception e)

Declare and initialize three instances for printing:

private System.Windows.Forms.PrintDialog prnDialog;
private System.Windows.Forms.PrintPreviewDialog prnPreview;
private System.Drawing.Printing.PrintDocument prnDocument;

this.prnDialog = new System.Windows.Forms.PrintDialog();
this.prnPreview = new System.Windows.Forms.PrintPreviewDialog();
this.prnDocument = new System.Drawing.Printing.PrintDocument();
// the Event of 'PrintPage'
prnDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler

To draw something on the report (as line or text):

  1. Get Left Margin, Right Margin, Top Margin, Bottom Margin, Report Width and Report Height:
    // Result of the Event 'PrintPage'
    private void prnDocument_PrintPage(object sender, 
    System.Drawing.Printing.PrintPageEventArgs e)
        leftMargin = (int)e.MarginBounds.Left;  	// leftMargin, rightMargin, 
    					// ... Declared before
        rightMargin = (int)e.MarginBounds.Right;
        topMargin = (int)e.MarginBounds.Top;
        bottomMargin = (int)e.MarginBounds.Bottom;
        InvoiceWidth = (int)e.MarginBounds.Width;
        InvoiceHeight = (int)e.MarginBounds.Height;
        // Draw Invoice Head
  2. Set Font and Color:
    Font InvTitleFont = new Font("Arial", 24, FontStyle.Regular);
    SolidBrush HeadBrush = new SolidBrush(Color.Blue);
  3. Set Font Height and Font Width and coordinate, then use DrawString method:
    private void SetInvoiceHead (Graphics g)
        //Invoice title:
        string InvTitle = "International Food Company";
        //Title Font:
        Font InvTitleFont = new Font("Arial", 24, FontStyle.Regular);
        //Title Color:
        SolidBrush HeadBrush = new SolidBrush(Color.Blue);
        //Title Height:
        int InvTitleHeight = (int)(InvTitleFont.GetHeight(g));
        //Title Length:
        int lenInvTitle = (int)g.MeasureString(InvTitle, InvTitleFont).Width;
        int CurrentX = leftMargin + (InvoiceWidth - 
    	lenInvTitle) / 2; //to set the title in center 
        int CurrentY = topMargin + InvTitleHeight;
        //draw the title:
        g.DrawString(InvTitle, InvTitleFont, HeadBrush, CurrentX, CurrentY);

The project has several pieces of code in three forms, please read the code, then run the program to see the result.

You can read about:

  • How to create a report using PrintPreviewDialog control and PrintDocument control?
  • How to draw Invoice head?
  • How to draw the table of products and its price?
  • How to compute and draw Invoice total?

If you have any ideas or if you find any problems, please tell me.

You can read my other article to see how to print invoice using VB.NET.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

No Biography provided

Comments and Discussions

QuestionMore than one pages issue Pin
prakkoir12-Jun-19 2:45
Memberprakkoir12-Jun-19 2:45 
Questionprint in Arabics Pin
Taula506-Feb-19 18:04
MemberTaula506-Feb-19 18:04 
Questioncan i use this code in wpf? Pin
Member 140969249-Jan-19 15:12
MemberMember 140969249-Jan-19 15:12 
QuestionNice Article- I have one clarification Pin
VigneshKumar9575-May-17 4:16
MemberVigneshKumar9575-May-17 4:16 
Questionhow can i set A template as background of invoice Pin
mukesh mourya23-Nov-14 18:14
Membermukesh mourya23-Nov-14 18:14 
QuestionHello Mostafa Pin
Member 989248630-Oct-14 11:33
MemberMember 989248630-Oct-14 11:33 
AnswerRe: Hello Mostafa Pin
Mostafa Kaisoun5-Nov-14 16:35
MemberMostafa Kaisoun5-Nov-14 16:35 
QuestionordGrid.TableStyles.Add(tableStyle);,Object reference not set to an instance of an object. Pin
sagar May201123-Jul-14 3:55
Membersagar May201123-Jul-14 3:55 
BugUnable to print the header part of the report Pin
arun_g14-Sep-13 0:39
Memberarun_g14-Sep-13 0:39 
QuestionGood Job Pin
z3ngew18-Aug-13 2:33
Memberz3ngew18-Aug-13 2:33 
QuestionDatabase Pin
Fifianty Hutapea25-Jun-13 21:20
MemberFifianty Hutapea25-Jun-13 21:20 
Questionabout database Pin
faizel s26-Mar-13 23:15
Memberfaizel s26-Mar-13 23:15 
AnswerRe: about database Pin
Mostafa Kaisoun4-Apr-13 15:33
MemberMostafa Kaisoun4-Apr-13 15:33 
GeneralRe: about database Pin
bluestuck28-May-17 21:01
Memberbluestuck28-May-17 21:01 
GeneralRe: about database Pin
bluestuck6-Aug-17 5:49
Memberbluestuck6-Aug-17 5:49 
GeneralRe: about database Pin
Divyesh Padamani23-Sep-17 21:51
MemberDivyesh Padamani23-Sep-17 21:51 
GeneralMy vote of 5 Pin
Shubh Agrahari4-Feb-13 3:19
MemberShubh Agrahari4-Feb-13 3:19 
QuestionComplain about the code project articles Pin
DurgeshSinghPatna19-Jul-12 9:30
MemberDurgeshSinghPatna19-Jul-12 9:30 
AnswerRe: Complain about the code project articles Pin
what_ever2-Sep-12 1:07
Memberwhat_ever2-Sep-12 1:07 
GeneralThanks Pin
anvas kuttan27-Mar-12 20:47
Memberanvas kuttan27-Mar-12 20:47 
GeneralRe: Thanks Pin
Mostafa Kaisoun28-Mar-12 8:38
MemberMostafa Kaisoun28-Mar-12 8:38 
GeneralMy vote of 5 Pin
Jimzie from Fresno18-Mar-12 3:55
MemberJimzie from Fresno18-Mar-12 3:55 
QuestionUrgent please Pin
sergiuu16-Dec-11 14:12
Membersergiuu16-Dec-11 14:12 
AnswerRe: Urgent please Pin
Mostafa Kaisoun18-Dec-11 18:17
MemberMostafa Kaisoun18-Dec-11 18:17 
GeneralMy vote of 5 Pin
wnicole27-Nov-11 21:15
Memberwnicole27-Nov-11 21:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.