为文本框创建字符分隔符

时间:2017-06-13 08:40:11

标签: c# winforms textbox separator

我正在为大学做更多的准备工作,现在有点困难。我正在尝试使用破折号('-')在文本框中创建十六进制值,因此我在键入时应该动态完成。

为了更加精确,这里有一些我想要做的图片:

如果我输入这样的字符:

image1

我希望他们在输入分隔符时显示分隔符:

image2

到目前为止,我已尝试使用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;
                    }
                }
            }
    }

1 个答案:

答案 0 :(得分:0)

一种方法是在文本发生变化时验证整个字符串。这将考虑粘贴文本以及键入。这有点野蛮,但对于一个相对较短的字符串,它应该做的工作:

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;
        }
    }
}