Print data in rows and columns in C#

Print data in rows and columns

This example shows how you can print data in rows and columns with column headers.

The example uses the following code to initialize the data.

// The sample data.
private string[] Headers =
    {"Name", "Street", "City", "State", "Zip"};
private string[,] Data =
    {"Alice Archer", "1276 Ash Ave", "Ann Arbor", "MI", "12893"},
    {"Bill Blaze", "26157 Beach Blvd", "Boron", "CA", "23617"},
    {"Cindy Carruthers", "352 Cherry Ct", "Chicago", "IL", "35271"},
    {"Dean Dent", "4526 Deerfield Dr", "Denver", "CO", "47848"},

When you click the program’s Print Preview button, the following code invokes the PrintPreviewDialog‘s ShowDialog method.

// Display a print preview.
private void btnPrintPreview_Click(object sender, EventArgs e)

The PrintPreviewDialog‘s PrintDocument property is set to a PrintDocument object that does the actual printing. That object’s PrintPage event handler generates the page that the program prints. That event handler, which is shown in the following code, is where most of the work happens.

// Print the document's page.
// Note that this version doesn't handle multiple pages.
private void pdocGrid_PrintPage(object sender,
    System.Drawing.Printing.PrintPageEventArgs e)
    // Use this font.
    using (Font header_font = new Font("Times New Roman",
        16, FontStyle.Bold))
        using (Font body_font = new Font("Times New Roman", 12))
            // We'll skip this much space between rows.
            int line_spacing = 20;

            // See how wide the columns must be.
            int[] column_widths = FindColumnWidths(
                e.Graphics, header_font, body_font, Headers, Data);

            // Start at the left margin.
            int x = e.MarginBounds.Left;

            // Print by columns.
            for (int col = 0; col < Headers.Length; col++)
                // Print the header.
                int y = e.MarginBounds.Top;
                    header_font, Brushes.Blue, x, y);
                y += (int)(line_spacing * 1.5);

                // Print the items in the column.
                for (int row = 0; row <=
                    Data.GetUpperBound(0); row++)
                    e.Graphics.DrawString(Data[row, col],
                        body_font, Brushes.Black, x, y);
                    y += line_spacing;

                // Move to the next column.
                x += column_widths[col];
            } // Looping over columns
        } // using body_font
    } // using header_font

    //DrawGrid(e, y)
    e.HasMorePages = false;

The event handler creates fonts for the grid’s column headers and the values. It then calls the FindColumnWidths method to see how wide each column must be to hold its data.

Next the code sets variable x to the page’s left margin and loops through the columns.

For each column, the code sets variable y to the page’s top margin. It then displays the column’s header and increases y to move down the page. It then loops through the data for that column, drawing each value at the current (x, y) position and increasing y to move down the page again.

After it finishes printing a column’s values, the code increases variable x by the width of the column so the next column appears to the right.

The following code shows the FindColumnWidths method.

// Figure out how wide each column should be.
private int[] FindColumnWidths(Graphics gr, Font header_font,
    Font body_font, string[] headers, string[,] values)
    // Make room for the widths.
    int[] widths = new int[headers.Length];

    // Find the width for each column.
    for (int col = 0; col < widths.Length; col++)
        // Check the column header.
        widths[col] = (int)gr.MeasureString(
            headers[col], header_font).Width;

        // Check the items.
        for (int row = 0; row <= values.GetUpperBound(0); row++)
            int value_width = (int)gr.MeasureString(
                values[row, col], body_font).Width;
            if (widths[col] < value_width)
                widths[col] = value_width;

        // Add some extra space.
        widths[col] += 20;

    return widths;

This code creates an array to hold column widths.

For each column, the code sets the column’s width to the width of its header. It then loops through the column’s values. If a value’s width is greater than the column’s current width, the program updates the column’s width. After it has check all of the values, the code adds some extra space so the values in the grid aren’t too close together.

Download Example   Follow me on Twitter   RSS feed

This entry was posted in graphics, printing and tagged , , , , , , , , , , , , , , . Bookmark the permalink.

6 Responses to Print data in rows and columns in C#

  1. Md Kamrul Islam says:

    Please help me how can I enable to print data serially.Below table is input(using crystal report for desktop application)

    Name Amount
    Kamrul 500
    Jamal 300
    Rasel 275
    Output format
    1st page
    Kamrul 500
    2nd page
    Jamal 300
    3rd Page
    Rasel 275

  2. Devi says:

    Hi I had a small requirement I had 2 datagridivew rows where I need to print them odd even. If odd print all the columns data to left if not to right. Can you help me

  3. Devi says:

    Here is the sample code which I am trying and I need the output as per the attached screenshot

    • RodStephens says:

      You should be able to do that. I would use variables x and y to keep of position as you print.

      Print the lines for an entry. Then if the next entry is even, increase x to move to the right column. If the next entry is odd, move x back to the left column and increase y to start a new row.

  4. Sinan Basalan says:

    I just found this article so that’s very good work instead of having some grid around but that’s okay I am happy with this. Thank you Sir.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.