为文本框创建字符分隔符

Creating a character separator for a textbox

我正在为上大学做更多的准备,现在有点卡住了。我正在尝试在输入时使用短划线 ('-') 勾勒出文本框中的十六进制值,因此应该动态完成。

更准确地说,这里有一些我正在尝试做的图片:

如果我像这样输入十六进制:

我希望它们在我输入时得到分隔符:

到目前为止,我已经尝试用 for 循环来完成它,我认为它应该已经成功了,但它没有打印出我的值,而只是没有文本的破折号。

这里是代码位:

   int i = 0;
        private void inputBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (hexRadioButton.Checked)
            {
                if (!char.IsControl(e.KeyChar))
                {
                    if (i < 2)
                    {
                        i++;
                        e.Handled = true;
                    }

                    else
                    {
                        i = 0;
                        inputBox.AppendText("-");
                        e.Handled = true;
                    }
                }
            }
    }

一种方法是在文本更改时验证整个字符串。这将解释粘贴文本和键入。这有点野蛮,但对于相对较短的字符串来说,它应该可以完成工作:

private void inputBox_TextChanged(object sender, EventArgs e)
{
    if (hexRadioButton.Checked)
    {
        var allowedValues = new[] 
        {
            'A', 'B', 'C', 'D', 'E', 'F',
            'a', 'b', 'c', 'd', 'e', 'f',
            '1', '2', '3', '4', '5', '6',
            '7', '8', '9', '0', '-'
        };

        var validString = new StringBuilder();
        var validChrIndex = 1;

        for (int i = 1; i <= inputBox.TextLength; i++)
        {
            var chr = inputBox.Text[i - 1];

            if (!allowedValues.Contains(chr)) continue;

            if (validChrIndex % 3 == 0)
            {
                if (chr != '-')
                {
                    validString.Append('-');
                    validChrIndex++;
                }
            }
            else if (chr == '-')
            {
                continue;
            }

            validString.Append(chr);
            validChrIndex++;
        }

        if (!validString.ToString().Equals(inputBox.Text))
        {
            inputBox.Text = validString.ToString();
            inputBox.SelectionStart = inputBox.TextLength;
        }
    }
}