Я недавно наткнулся на эту проблему и нашел удивительный ответ Коди Грей. Я использовал это в своих интересах, но недавно резонировал с одним из комментариев к его ответу, в котором говорилось о том, что текст не пройдет проверку, если суффикс все еще там. Я создал, вероятно, не очень профессиональное быстрое решение для этого.
В основном поле this.Text
считывается для чисел.
После того, как числа найдены, они помещаются в this.Text
, но для того, чтобы мы не создали переполнение стека 1008 *.
, требуется отладка или все, что вам нужно, чтобы вызвать его.
После ввода нового текста с единственным номером для вызова процесса вызываются обычные ParseEditText();
и UpdateEditText();
.
Это не самое дружественное к ресурсам или эффективное решение, но большинство современных компьютеров сегодня должно прекрасно с этим справиться.
Также вы заметите, что я создал свойство для изменения суффикса просто для более удобного использования в редакторе.
public class NumericUpDownUnit : System.Windows.Forms.NumericUpDown
{
public string Suffix{ get; set; }
private bool Debounce = false;
public NumericUpDownUnit()
{
}
protected override void ValidateEditText()
{
if (!Debounce) //I had to use a debouncer because any time you update the 'this.Text' field it calls this method.
{
Debounce = true; //Make sure we don't create a stack overflow.
string tempText = this.Text; //Get the text that was put into the box.
string numbers = ""; //For holding the numbers we find.
foreach (char item in tempText) //Implement whatever check wizardry you like here using 'tempText' string.
{
if (Char.IsDigit(item))
{
numbers += item;
}
else
{
break;
}
}
decimal actualNum = Decimal.Parse(numbers, System.Globalization.NumberStyles.AllowLeadingSign);
if (actualNum > this.Maximum) //Make sure our number is within min/max
this.Value = this.Maximum;
else if (actualNum < this.Minimum)
this.Value = this.Minimum;
else
this.Value = actualNum;
ParseEditText(); //Carry on with the normal checks.
UpdateEditText();
Debounce = false;
}
}
protected override void UpdateEditText()
{
// Append the units to the end of the numeric value
this.Text = this.Value + Suffix;
}
}
Пожалуйста, не стесняйтесь улучшить мой ответ или исправить меня, если что-то не так, я программист-самоучка, все еще учусь.