title: How can I get tabs to print using this custom Printing class?
body: <p>The following code is what I'm trying to use to print data to the printer.  The data is printing, but tabs are not printing.  My string that I'm printing looks like this:</p>
  
  <pre><code>string textToPrint = "Member Number\tAddress\tCity\tState";
  </code></pre>
  
  <p>But when it prints, it looks like this <code>Member NumberAddressCityState</code>.</p>
  
  <p>I found this printer class on the internet, and it seems to work (characters do print out on the report) except for printing tabs.  How can I make sure that tabs print?</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Drawing;
  using System.Drawing.Printing;
  
  namespace HighLowReport
  {
      public class PCPrint : System.Drawing.Printing.PrintDocument
      {
          //Property variable for the font the user wishes to use
          private Font _font;
  
          //Property variable for the text to be printed
          private string _text;
  
          //Property to hold the text that is to be printed
          public string TextToPrint
          {
              get { return _text; }
              set { _text = value; }
          }
  
          //Property to hold the font the user wishes to use
          public Font PrinterFont
          {
              get { return _font; }
              set { _font = value; }
          }
  
          // Static variable to hold the current character
          // we're currently dealing with.
          static int curChar;
  
          // Empty constructor
          public PCPrint()
              : base()
          {
              // set the file stream
              // Instantiate out Text property to an empty string
              _text = string.Empty;
          }
  
          // Constructor to initialize our printer object
          // and the text it's supposed to be printing
          public PCPrint(string str)
              : base()
          {
              // Set the file stream
              // Set our text property value
              _text = str;
          }
  
          protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
          {
              // Run base code
              base.OnBeginPrint(e);
  
              // Check to see if the user provided a font
              // if they didn't the we default to Times New Roman
              if (_font == null)
              {
                  _font = new Font("Times New Roman", 10);
              }
          }
  
          // Override the default OnPrintPage method of the PrintDocument
          protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
          {
              // Run base code
              base.OnPrintPage(e);
  
              // declare local variables needed
              int printHeight;
              int printWidth;
              int leftMargin;
              int rightMargin;
              Int32 lines;
              Int32 chars;
  
              // Set print area size and margins
              {                
                  printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
                  printWidth = base.DefaultPageSettings.PaperSize.Width = base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
                  leftMargin = base.DefaultPageSettings.Margins.Left; //X
                  rightMargin = base.DefaultPageSettings.Margins.Right; //Y
              }
  
              // Check if the user selected to print in Landscape mode
              // if they did then we need to swap height/width parameters
              if (base.DefaultPageSettings.Landscape)
              {
                  int tmp;
                  tmp = printHeight;
                  printHeight = printWidth;
                  printWidth = tmp;
              }
  
              // Now we need to determine the total number of lines
              // we're going to be printing
              Int32 numLines = (int)printHeight / PrinterFont.Height;
  
              // Create a rectangle printing area for our document
              RectangleF printArea = new RectangleF(leftMargin, rightMargin, printWidth, printHeight);
  
              // Use StringFormat class for the text layout of our document
              StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
  
              // Fit as many characters as we can into the print area
  
              e.Graphics.MeasureString(_text.Substring(RemoveZeros(ref curChar)), PrinterFont, new SizeF(printWidth, printHeight), format, out chars, out lines);
  
              // Print the page
              e.Graphics.DrawString(_text.Substring(RemoveZeros(ref curChar)), PrinterFont, Brushes.Black, printArea, format);
  
              // Increase current char count
              curChar += chars;
  
              // Determine if there is more text to print, if
              // there is then tell the printer there is more coming
              if (curChar &lt; _text.Length)
              {
                  e.HasMorePages = true;
              }
              else
              {
                  e.HasMorePages = false;
                  curChar = 0;
              }
          }
  
          // Function to replace any zeros in the size to a 1
          // Zeros will mess up the printing area
          public int RemoveZeros(ref int value)
          {
              // Check the value passed into the function
              // If the value is a 0 (zero) then return a 1,
              // otherwise return the value passed in
              while (_text[value] == '\0')
              {
                  value++;
              }
              return value;
          }
      }
  }
  </code></pre>