Useful C# Windows Forms Input Masks

I have always had a need to create “input masks” for my C# data entry screens. They are used to format the data entered into text boxes that hold quantities, telephone numbers, currencies, dates, etc.

First, here is an example of an input mask for a date in “mm/dd/yy” format. The “fire_DateEntered” function is triggered whenever the user types something into the “TransactionDate.Text” text box.

  1. // input mask formatting for the new transaction date. this will trigger  
  2. // with each successive keystroke as the user enters the date characters.          
  3. private void fire_DateEntered(object sender, KeyEventArgs e)  
  4. {  
  5.     int formaterrorflag;  
  6.     string dateinputstring;  
  7.     char[] datecharacterarray;  
  8.   
  9.     // get the data from the “TransactionDate.Text” text  
  10.     // box and convert to character array for further processing.          
  11.     dateinputstring = TransactionDate.Text;  
  12.     datecharacterarray = dateinputstring.ToCharArray(0, dateinputstring.Length);  
  13.   
  14.     formaterrorflag = 0;  
  15.   
  16.     // next, compare each of the 8 chars to make sure they  
  17.     // conform to the “mm/dd/yy” date input mask.      
  18.     if (e.KeyValue != 8 && e.KeyValue != 46)  
  19.     {  
  20.         if (dateinputstring.Length >= 1)  
  21.         {  
  22.                if ((datecharacterarray[0] < (char)48 || datecharacterarray[0] > (char)49) && datecharacterarray[0] > (char)32) formaterrorflag = 1;  
  23.            }  
  24.            if (dateinputstring.Length >= 2)  
  25.            {  
  26.                if ((datecharacterarray[1] < (char)48 || datecharacterarray[1] > (char)57) && datecharacterarray[1] > (char)32) formaterrorflag = 2;  
  27.            }  
  28.            if (dateinputstring.Length >= 3)  
  29.            {  
  30.                if (datecharacterarray[2] != (char)47) formaterrorflag = 22;  
  31.            }  
  32.            if (dateinputstring.Length >= 4)  
  33.            {  
  34.                if ((datecharacterarray[3] < (char)48 || datecharacterarray[3] > (char)51) && datecharacterarray[3] > (char)32) formaterrorflag = 3;  
  35.            }  
  36.            if (dateinputstring.Length >= 5)  
  37.            {  
  38.                if ((datecharacterarray[4] < (char)48 || datecharacterarray[4] > (char)57) && datecharacterarray[4] > (char)32) formaterrorflag = 4;  
  39.            }  
  40.            if (dateinputstring.Length >= 6)  
  41.            {  
  42.                if (datecharacterarray[5] != (char)47) formaterrorflag = 55;  
  43.            }  
  44.            if (dateinputstring.Length >= 7)  
  45.            {   
  46.                if ((datecharacterarray[6] < (char)48 || datecharacterarray[6] > (char)57) && datecharacterarray[6] > (char)32) formaterrorflag = 5;  
  47.            }   
  48.            if (dateinputstring.Length == 8)  
  49.            {  
  50.                if ((datecharacterarray[7] < (char)48 || datecharacterarray[7] > (char)57) && datecharacterarray[7] > (char)32) formaterrorflag = 6;  
  51.            }  
  52.   
  53.      }  
  54.   
  55.      // if the user is at the third or the sixth character slot in  
  56.      // the data entry process, then auto-insert the forward slash  
  57.      // character so the user doesn’t have to do it.            
  58.      if (formaterrorflag == 0)  
  59.      {  
  60.          if (dateinputstring.Length == 2)  
  61.          {  
  62.              dateinputstring = dateinputstring + "/";  
  63.              this.TransactionDate.Text = dateinputstring;  
  64.              this.TransactionDate.SelectionStart = dateinputstring.Length;  
  65.          }  
  66.          if (dateinputstring.Length == 5)  
  67.          {  
  68.              dateinputstring = dateinputstring + "/";  
  69.              this.TransactionDate.Text = dateinputstring;  
  70.              this.TransactionDate.SelectionStart = dateinputstring.Length;  
  71.          }  
  72.      }  
  73.   
  74.         // if we are at the end of the data entry, then jump to the next field.        
  75.         if (formaterrorflag == 0 && dateinputstring.Length == 7)  
  76.         {  
  77.             this.nexttextBox.Focus();  
  78.         }  
  79.   
  80.         // if the user entered a period character, then blank  
  81.         // what has been typed and make the user start over with  
  82.        // something that will hopefully conform to the input mask we are using.  
  83.        if (formaterrorflag > 0 || e.KeyValue == 46)  
  84.        {  
  85.            this.TransactionDate.Text.Remove(0, dateinputstring.Length);  
  86.            this.TransactionDate.Text = "";  
  87.        }  
  88.   
  89. }  
Moving on, here is an input mask for a telephone number. The “fire_phone_number” function is fired whenever the user types something into the “PhoneNumber.Text” text box.
  1. // input mask formatting for the phone number. this will trigger with each  
  2. // successive keystroke as the user enters the phone number digits.       
  3. private void fire_phone_number(object sender, System.Windows.Forms.KeyEventArgs e)  
  4. {  
  5.   
  6.     int formaterrorflag;  
  7.     string phoneinputstring;  
  8.     char[] phonecharacterarray;  
  9.   
  10.     // get the data from the “PhoneNumber.Text” text  
  11.     // box and convert to character array for further processing.         
  12.     phoneinputstring = PhoneNumber.Text;  
  13.     phonecharacterarray = phoneinputstring.ToCharArray(0, phoneinputstring.Length);  
  14.   
  15.     formaterrorflag = 0;  
  16.   
  17.     // next, compare each of the 12 chars to make sure they  
  18.     // conform to the “999-999-9999” phone number input mask.     
  19.     if (e.KeyValue != 8 && e.KeyValue != 46)  
  20.     {  
  21.         if (phoneinputstring.Length >= 1)  
  22.         {  
  23.             if ((phonecharacterarray[0] < (char)48 || phonecharacterarray[0] > (char)57) && phonecharacterarray[0] > (char)32) formaterrorflag = 1;  
  24.         }  
  25.         if (phoneinputstring.Length >= 2)  
  26.         {  
  27.             if ((phonecharacterarray[1] < (char)48 || phonecharacterarray[1] > (char)57) && phonecharacterarray[1] > (char)32) formaterrorflag = 2;  
  28.         }  
  29.         if (phoneinputstring.Length >= 3)  
  30.         {  
  31.             if ((phonecharacterarray[2] < (char)48 || phonecharacterarray[2] > (char)57) && phonecharacterarray[2] > (char)32) formaterrorflag = 3;  
  32.         }  
  33.         if (phoneinputstring.Length >= 4)  
  34.         {  
  35.             if (phonecharacterarray[3] != (char)45) formaterrorflag = 33;  
  36.         }  
  37.         if (phoneinputstring.Length >= 5)  
  38.         {  
  39.             if ((phonecharacterarray[4] < (char)48 || phonecharacterarray[4] > (char)57) && phonecharacterarray[4] > (char)32) formaterrorflag = 4;  
  40.         }  
  41.         if (phoneinputstring.Length >= 6)  
  42.         {  
  43.             if ((phonecharacterarray[5] < (char)48 || phonecharacterarray[5] > (char)57) && phonecharacterarray[5] > (char)32) formaterrorflag = 5;  
  44.         }  
  45.         if (phoneinputstring.Length >= 7)  
  46.         {  
  47.             if ((phonecharacterarray[6] < (char)48 || phonecharacterarray[6] > (char)57) && phonecharacterarray[6] > (char)32) formaterrorflag = 6;  
  48.         }  
  49.         if (phoneinputstring.Length >= 8)  
  50.         {  
  51.             if (phonecharacterarray[7] != (char)45) formaterrorflag = 66;  
  52.         }  
  53.         if (phoneinputstring.Length >= 9)  
  54.         {  
  55.             if ((phonecharacterarray[8] < (char)48 || phonecharacterarray[8] > (char)57) && phonecharacterarray[8] > (char)32) formaterrorflag = 7;  
  56.         }  
  57.         if (phoneinputstring.Length == 10)  
  58.         {  
  59.             if ((phonecharacterarray[9] < (char)48 || phonecharacterarray[9] > (char)57) && phonecharacterarray[9] > (char)32) formaterrorflag = 8;  
  60.         }  
  61.         if (phoneinputstring.Length == 11)  
  62.         {  
  63.             if ((phonecharacterarray[10] < (char)48 || phonecharacterarray[10] > (char)57) && phonecharacterarray[10] > (char)32) formaterrorflag = 9;  
  64.         }  
  65.         if (phoneinputstring.Length == 12)  
  66.         {  
  67.             if ((phonecharacterarray[11] < (char)48 || phonecharacterarray[11] > (char)57) && phonecharacterarray[11] > (char)32) formaterrorflag = 10;  
  68.         }  
  69.   
  70.     }  
  71.   
  72.     // if the user is at the fourth or the eigth character slot in  
  73.     // the data entry process, then auto-insert the hyphen  
  74.     // character so the user doesn’t have to do it.           
  75.     if (formaterrorflag == 0)  
  76.     {  
  77.         if (phoneinputstring.Length == 3)  
  78.         {  
  79.             phoneinputstring = phoneinputstring + "-";  
  80.             this.PhoneNumber.Text = phoneinputstring;  
  81.             this.PhoneNumber.SelectionStart = phoneinputstring.Length;  
  82.         }  
  83.         if (phoneinputstring.Length == 7)  
  84.         {  
  85.             phoneinputstring = phoneinputstring + "-";  
  86.             this.PhoneNumber.Text = phoneinputstring;  
  87.             this.c.SelectionStart = phoneinputstring.Length;  
  88.         }  
  89.     }  
  90.   
  91.     // if we are at the end of the data entry, then jump to the next field.       
  92.     if (formaterrorflag == 0 && phoneinputstring.Length == 11)  
  93.     {  
  94.         this.nexttextBox.Focus();  
  95.     }  
  96.   
  97.     // if the user entered a period character, then blank  
  98.     // what has been typed and make the user start over with  
  99.     // something that will hopefully conform to the input mask we are using.  
  100.     if (formaterrorflag > 0 || e.KeyValue == 46)  
  101.     {  
  102.         this.PhoneNumber.Text.Remove(0, phoneinputstring.Length);  
  103.         this.PhoneNumber.Text = "";  
  104.     }  
  105.   
  106. }  
Finally, here is an input mask for a currency amount. The “fire_StartAmountEntered” function is fired whenever the user types something into the “currency_amount.Text” text box. After leaving the “currency_amount.Text” text box, supplemental formatting is applied to compensate for omitted decimals and/or decimal places in the inputted data. 
  1.  // input mask formatting for the currency amount. this will trigger with each  
  2. // successive keystroke as the user enters the currency amount digits.        
  3. private void fire_StartAmountEntered(object sender, KeyEventArgs e)  
  4. {  
  5.     int formaterrorflag;  
  6.     string amountinputstring;  
  7.     char[] amountcharacterarray;  
  8.   
  9.     // get the data from the “currency_amount.Text” text  
  10.     // box and convert to character array for further processing.         
  11.     amountinputstring = currency_amount.Text;  
  12.     amountcharacterarray = amountinputstring.ToCharArray(0, amountinputstring.Length);  
  13.   
  14.     formaterrorflag = 0;  
  15.   
  16.     // next, compare each of the 10 chars to make sure they  
  17.     // conform to the currency amount input mask.     
  18.     if (amountinputstring.Length >= 1)  
  19.     {  
  20.         if (amountcharacterarray[0] < (char)32 || amountcharacterarray[0] > (char)57) formaterrorflag = 1;  
  21.     }  
  22.     if (amountinputstring.Length >= 2)  
  23.     {  
  24.         if (amountcharacterarray[1] < (char)32 || amountcharacterarray[1] > (char)57) formaterrorflag = 1;  
  25.     }  
  26.     if (amountinputstring.Length >= 3)  
  27.     {  
  28.         if (amountcharacterarray[2] < (char)32 || amountcharacterarray[2] > (char)57) formaterrorflag = 1;  
  29.     }  
  30.     if (amountinputstring.Length >= 4)  
  31.     {  
  32.         if (amountcharacterarray[3] < (char)32 || amountcharacterarray[3] > (char)57) formaterrorflag = 1;  
  33.     }  
  34.     if (amountinputstring.Length == 5)  
  35.     {  
  36.         if (amountcharacterarray[4] < (char)32 || amountcharacterarray[4] > (char)57) formaterrorflag = 1;  
  37.     }  
  38.     if (amountinputstring.Length >= 6)  
  39.     {  
  40.         if (amountcharacterarray[5] < (char)32 || amountcharacterarray[5] > (char)57) formaterrorflag = 1;  
  41.     }  
  42.     if (amountinputstring.Length >= 7)  
  43.     {  
  44.         if (amountcharacterarray[6] < (char)32 || amountcharacterarray[6] > (char)57) formaterrorflag = 1;  
  45.     }  
  46.     if (amountinputstring.Length >= 8)  
  47.     {  
  48.         if (amountcharacterarray[7] < (char)32 || amountcharacterarray[7] > (char)57) formaterrorflag = 1;  
  49.     }  
  50.     if (amountinputstring.Length >= 9)  
  51.     {  
  52.         if (amountcharacterarray[8] < (char)32 || amountcharacterarray[8] > (char)57) formaterrorflag = 1;  
  53.     }  
  54.     if (amountinputstring.Length == 10)  
  55.     {  
  56.         if (amountcharacterarray[9] < (char)32 || amountcharacterarray[9] > (char)57) formaterrorflag = 1;  
  57.     }  
  58.   
  59.     // if there is an error, then blank what has been typed and make the user  
  60.     // start over with something that will hopefully conform to the input mask we are using.  
  61.     if (formaterrorflag > 0)  
  62.     {  
  63.         this.currency_amount.Text.Remove(0, amountinputstring.Length);  
  64.         this.currency_amount.Text = "";  
  65.     }  
  66.   
  67. }  
  68.   
  69. // this will format the entered currency amount after the “currency_amount.Text” text  
  70. // box has lost focus. It will add a decimal point and/or decimal places where needed.    
  71. private void fire_LeaveAmountEntered(object sender, EventArgs e)  
  72. {  
  73.     int flag_variable, counter;  
  74.     long manual_amount;  
  75.     string stramount_initial, stramount_finished;  
  76.   
  77.   
  78.     // convert the “currency_amount.Text” text box to a string, then  
  79.     // begin the formatting process.  
  80.     stramount_initial = currency_amount.Text;  
  81.     stramount_finished = currency_amount.Text;  
  82.   
  83.     if (stramount_initial.EndsWith("."))  
  84.     {  
  85.         stramount_finished = stramount_initial + "00";  
  86.     }  
  87.   
  88.     // this concatenates one decimal place to the right of the data.  
  89.     if (stramount_initial.EndsWith(".0") || stramount_initial.EndsWith(".1") || stramount_initial.EndsWith(".2") || stramount_initial.EndsWith(".3") || stramount_initial.EndsWith(".4") || stramount_initial.EndsWith(".5") || stramount_initial.EndsWith(".6") || stramount_initial.EndsWith(".7") || stramount_initial.EndsWith(".8") || stramount_initial.EndsWith(".9"))  
  90.     {  
  91.         stramount_finished = stramount_initial + "0";  
  92.     }  
  93.   
  94.     // this concatenates a decimal point with 2 decimal places to the right of the data.  
  95.     if (!stramount_initial.Contains("."))  
  96.     {  
  97.   
  98.         stramount_finished = stramount_initial + ".00";  
  99.     }  
  100.   
  101.   
  102.    // this next block of code will left pad the currency amount with a  
  103.     // variable number of spaces depending on the length in characters  
  104.     // of the inputted data.    
  105.     flag_variable = 0;  
  106.     if (stramount_finished.Length == 1)  
  107.     {  
  108.         stramount_finished = "         " + stramount_finished;  
  109.         flag_variable = 1;  
  110.     }  
  111.     if (stramount_finished.Length == 2 && a == 0)  
  112.     {  
  113.         stramount_finished = "        " + stramount_finished;  
  114.         flag_variable = 1;  
  115.     }  
  116.     if (stramount_finished.Length == 3 && a == 0)  
  117.     {  
  118.         stramount_finished = "       " + stramount_finished;  
  119.         flag_variable = 1;  
  120.     }  
  121.     if (stramount_finished.Length == 4 && a == 0)  
  122.     {  
  123.         stramount_finished = "      " + stramount_finished;  
  124.         flag_variable = 1;  
  125.     }  
  126.     if (stramount_finished.Length == 5 && a == 0)  
  127.     {  
  128.         stramount_finished = "     " + stramount_finished;  
  129.         flag_variable = 1;  
  130.     }  
  131.     if (stramount_finished.Length == 6 && a == 0)  
  132.     {  
  133.         stramount_finished = "    " + stramount_finished;  
  134.         flag_variable = 1;  
  135.     }  
  136.     if (stramount_finished.Length == 7 && a == 0)  
  137.     {  
  138.         stramount_finished = "   " + stramount_finished;  
  139.         flag_variable = 1;  
  140.     }  
  141.     if (stramount_finished.Length == 8 && a == 0)  
  142.     {  
  143.         stramount_finished = "  " + stramount_finished;  
  144.         flag_variable = 1;  
  145.     }  
  146.     if (stramount_finished.Length == 9 && a == 0)  
  147.     {  
  148.         stramount_finished = " " + stramount_finished;  
  149.         flag_variable = 1;  
  150.     }  
  151.   
  152.   
  153.      // convert the formatted currency amount to a long integer, then use that as a guide for  
  154.      // inserting commas in its string expression counterpart.  
  155.     for (counter = 0; counter < 10; counter++)  
  156.     {  
  157.         convert_to_number[a] = 0;  
  158.         if (stramount_finished.Substring(counter, 1) == "0") convert_to_number[counter] = 0;  
  159.         if (stramount_finished.Substring(counter, 1) == "1") convert_to_number[counter] = 1;  
  160.         if (stramount_finished.Substring(counter, 1) == "2") convert_to_number[counter] = 2;  
  161.         if (stramount_finished.Substring(counter, 1) == "3") convert_to_number[counter] = 3;  
  162.         if (stramount_finished.Substring(counter, 1) == "4") convert_to_number[counter] = 4; counter  
  163.         if (stramount_finished.Substring(counter, 1) == "5") convert_to_number[counter] = 5;  
  164.         if (stramount_finished.Substring(counter, 1) == "6") convert_to_number[counter] = 6;  
  165.         if (stramount_finished.Substring(counter, 1) == "7") convert_to_number[counter] = 7;  
  166.         if (stramount_finished.Substring(counter, 1) == "8") convert_to_number[counter] = 8;  
  167.         if (stramount_finished.Substring(counter, 1) == "9") convert_to_number[counter] = 9;  
  168.     }  
  169.     manual_amount = ((convert_to_number[0] * 100000000) + (convert_to_number[1] * 10000000) + (convert_to_number[2] * 1000000) + (convert_to_number[3] * 100000) + (convert_to_number[4] * 10000) + (convert_to_number[5] * 1000) + (convert_to_number[6] * 100) + (convert_to_number[8] * 10) + (convert_to_number[9] * 1));  
  170.   
  171.   
  172.     // this will insert commas in the appropriate places as mentioned above.  
  173.     if (manual_amount >= 100000 && manual_amount < 100000000 && stramount_finished.Substring(3, 1) != " ")  
  174.     {  
  175.         stramount_finished = stramount_finished.Substring(0, 4) + "," + stramount_finished.Substring(4, 6);  
  176.     }  
  177.     if (manual_amount >= 100000000 && stramount_finished.Substring(0, 1) != " ")  
  178.     {  
  179.         stramount_finished = stramount_finished.Substring(0, 1) + "," + stramount_finished.Substring(1, 3) + "," + stramount_finished.Substring(4, 6);  
  180.     }  
  181.     if (manual_amount < 100000)  
  182.     {  
  183.         stramount_finished = " " + stramount_finished;  
  184.     }  
  185.   
  186.     // assign this formatted currency amount back to the “currency_amount.Text”  text box.  
  187.     this.currency_amount.Text = stramount_finished;  
  188.   
  189.   
  190. }  
These are typical examples of input masks I use for application development projects. And these are purely homegrown, I didn’t glean any of the code from someone’s programming. They have proven themselves to be quite reliable, too.