Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //https://stackoverflow.com/questions/61099950/how-to-textbox-inputs-of-custom-format-in-c?noredirect=1#comment108120129_61099950
- //April 4, 2020
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Windows.Forms;
- using System.Text.RegularExpressions;
- using System.Drawing;
- namespace JQ
- {
- [DesignerCategory("Code")]
- class PrintPageRangeTB : TextBox
- {
- #region Private Fields
- private const int WM_PAINT = 0xF;
- #endregion
- #region Constructors
- public PrintPageRangeTB() : base() { }
- #endregion
- #region Properties
- public int Min { get; set; } = 0;
- public int Max { get; set; } = 1000;
- public string CueText { get; set; } = "e.g. 1-5, 8, 15-20";
- public bool ShowCue { get; set; } = true;
- [Browsable(false)]
- public IEnumerable<int> Pages
- {
- get
- {
- var pages = new HashSet<int>();
- if (IsValidInput())
- {
- var pat = @"(\d+)-(\d+)";
- var parts = Text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
- foreach(var part in parts)
- {
- var m = Regex.Match(part, pat);
- if (m != null && m.Groups.Count == 3)
- {
- var x = int.Parse(m.Groups[1].Value);
- var y = int.Parse(m.Groups[2].Value);
- for (var i = Math.Min(x, y); i <= Math.Max(x, y); i++)
- pages.Add(i);
- }
- else if (int.TryParse(part.Replace("-", ""), out int v))
- pages.Add(v);
- }
- }
- return pages.OrderBy(x => x);
- }
- }
- [Browsable(false)]
- public bool IsValidPageRange => TextLength > 0 && IsValidInput();
- #endregion
- #region Base
- protected override void OnKeyPress(KeyPressEventArgs e)
- {
- base.OnKeyPress(e);
- if (!char.IsControl(e.KeyChar) &&
- !char.IsDigit(e.KeyChar) &&
- e.KeyChar != '-' &&
- e.KeyChar != ',')
- e.Handled = true;
- }
- protected override void OnTextChanged(EventArgs e)
- {
- base.OnTextChanged(e);
- if (!IsValidInput())
- SendKeys.SendWait("{BS}");
- }
- protected override void WndProc(ref Message m)
- {
- base.WndProc(ref m);
- if (m.Msg == WM_PAINT)
- {
- if (!Focused &&
- string.IsNullOrEmpty(Text) &&
- ShowCue &&
- !string.IsNullOrEmpty(CueText))
- {
- using (var graphics = CreateGraphics())
- {
- TextRenderer.DrawText(
- graphics,
- CueText,
- Font,
- ClientRectangle,
- SystemColors.GrayText,
- Enabled ? BackColor : SystemColors.Control,
- TextFormatFlags.Top | TextFormatFlags.Left);
- }
- }
- }
- }
- #endregion
- #region Private Methods
- private bool IsValidInput()
- {
- var parts = Text.Split(new[] { '-', ',' }, StringSplitOptions.RemoveEmptyEntries);
- var pages = parts.Where(x => int.TryParse(x, out _)).Select(x => int.Parse(x));
- return !parts.Any(x => x.Length > 1 && x.StartsWith("0")) &&
- !Regex.IsMatch(Text, @"^-|^,|--|,,|,-|-,|\d+-\d+-|-\d+-") &&
- !pages.Any(x => x < Min || x > Max);
- }
- #endregion
- }
- #region Public Methods
- public string PagesString(string separator = ", ") =>
- string.Join(separator, Pages);
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment