JQSOFT

PrintCustomSelectionTextBox

Apr 9th, 2020
1,108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.19 KB | None | 0 0
  1. //https://stackoverflow.com/questions/61099950/how-to-textbox-inputs-of-custom-format-in-c?noredirect=1#comment108120129_61099950
  2. //April 4, 2020
  3.  
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Linq;
  8. using System.Windows.Forms;
  9. using System.Text.RegularExpressions;
  10. using System.Drawing;
  11.  
  12. namespace JQ
  13. {
  14.     [DesignerCategory("Code")]
  15.     class PrintPageRangeTB : TextBox
  16.     {
  17.         #region Private Fields
  18.  
  19.         private const int WM_PAINT = 0xF;
  20.  
  21.         #endregion
  22.  
  23.         #region Constructors
  24.  
  25.         public PrintPageRangeTB() : base() { }
  26.  
  27.         #endregion
  28.  
  29.         #region Properties
  30.  
  31.         public int Min { get; set; } = 0;
  32.         public int Max { get; set; } = 1000;
  33.         public string CueText { get; set; } = "e.g. 1-5, 8, 15-20";
  34.         public bool ShowCue { get; set; } = true;
  35.         [Browsable(false)]
  36.         public IEnumerable<int> Pages
  37.         {
  38.             get
  39.             {
  40.                 var pages = new HashSet<int>();
  41.  
  42.                 if (IsValidInput())
  43.                 {
  44.                     var pat = @"(\d+)-(\d+)";
  45.                     var parts = Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  46.  
  47.                     foreach(var part in parts)
  48.                     {
  49.                         var m = Regex.Match(part, pat);
  50.  
  51.                         if (m != null && m.Groups.Count == 3)
  52.                         {
  53.                             var x = int.Parse(m.Groups[1].Value);
  54.                             var y = int.Parse(m.Groups[2].Value);
  55.  
  56.                             for (var i = Math.Min(x, y); i <= Math.Max(x, y); i++)
  57.                                 pages.Add(i);
  58.                         }
  59.                         else if (int.TryParse(part.Replace("-", ""), out int v))
  60.                             pages.Add(v);
  61.                     }
  62.                 }
  63.                 return pages.OrderBy(x => x);
  64.             }
  65.         }
  66.  
  67.         [Browsable(false)]
  68.         public bool IsValidPageRange => TextLength > 0 && IsValidInput();
  69.  
  70.         #endregion
  71.  
  72.         #region Base
  73.  
  74.         protected override void OnKeyPress(KeyPressEventArgs e)
  75.         {
  76.             base.OnKeyPress(e);
  77.             if (!char.IsControl(e.KeyChar) &&
  78.                 !char.IsDigit(e.KeyChar) &&
  79.                 e.KeyChar != '-' &&
  80.                 e.KeyChar != ',')
  81.                 e.Handled = true;
  82.         }
  83.  
  84.         protected override void OnTextChanged(EventArgs e)
  85.         {
  86.             base.OnTextChanged(e);
  87.  
  88.             if (!IsValidInput())
  89.                 SendKeys.SendWait("{BS}");
  90.         }
  91.  
  92.         protected override void WndProc(ref Message m)
  93.         {
  94.             base.WndProc(ref m);
  95.  
  96.             if (m.Msg == WM_PAINT)
  97.             {
  98.                 if (!Focused &&
  99.                     string.IsNullOrEmpty(Text) &&
  100.                     ShowCue &&
  101.                     !string.IsNullOrEmpty(CueText))
  102.                 {
  103.                     using (var graphics = CreateGraphics())
  104.                     {
  105.                         TextRenderer.DrawText(
  106.                             graphics,
  107.                             CueText,
  108.                             Font,
  109.                             ClientRectangle,
  110.                             SystemColors.GrayText,
  111.                             Enabled ? BackColor : SystemColors.Control,
  112.                             TextFormatFlags.Top | TextFormatFlags.Left);
  113.                     }
  114.                 }
  115.             }
  116.         }
  117.  
  118.         #endregion
  119.  
  120.         #region Private Methods
  121.  
  122.         private bool IsValidInput()
  123.         {
  124.             var parts = Text.Split(new[] { '-', ',' }, StringSplitOptions.RemoveEmptyEntries);
  125.             var pages = parts.Where(x => int.TryParse(x, out _)).Select(x => int.Parse(x));
  126.  
  127.             return !parts.Any(x => x.Length > 1 && x.StartsWith("0")) &&
  128.                 !Regex.IsMatch(Text, @"^-|^,|--|,,|,-|-,|\d+-\d+-|-\d+-") &&
  129.                 !pages.Any(x => x < Min || x > Max);
  130.         }
  131.            
  132.         #endregion
  133.     }
  134.  
  135.         #region Public Methods
  136.  
  137.         public string PagesString(string separator = ", ") =>
  138.             string.Join(separator, Pages);
  139.  
  140.         #endregion
  141. }
Advertisement
Add Comment
Please, Sign In to add comment