C# 如何使用用户';谁的输入?

C# 如何使用用户';谁的输入?,c#,.net,winforms,validation,C#,.net,Winforms,Validation,我的表单中有一个文本框,用户应该在那里输入一些字符串 在每2个字符之后,它应该自动在其中添加一个“|”。但我不知道怎么做。这是我的密码: private void textBox1_TextChanged(object sender, EventArgs e) { string input = textBox1.Text; int count = 0; foreach (char c in input) { count++; if (cou

我的表单中有一个
文本框
,用户应该在那里输入一些字符串

在每2个字符之后,它应该自动在其中添加一个
“|”
。但我不知道怎么做。这是我的密码:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string input = textBox1.Text; int count = 0;
    foreach (char c in input)
    {
        count++;
        if (count == 2)
        {
            input += '|';
            count = 0;
            textBox1.Text = input;
        }
    }
}
  • 用户只能输入十六进制字符(表示0-9,a-f)

我在
Keypress
事件中尝试了
e.Keychar
,但如果用户使用
Copy-Paste
Ctrl-C
Ctrl-V
避免
Ctrl
按键,则该方法无效

if (e.Control == true)
{
    MessageBox.Show("Cut/Copy and Paste Options are disabled");
}

如果不是必须的话,您不应该处理
TextChanged
事件,但是您应该依赖于
MaskedTextBox
,它正是为此目的而构建的

你可以找到一条很好的步行路线

基本上,您应该设置
Mask
属性。您甚至可以使用来确保只键入允许的值


“操作指南”:

创建一个
MaskedTextBox
控件,并将掩码设置为
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
(“&”表示任何ASCII字符,根据需要重复
\\\\&&&&&
)。然后创建一个
TextChanged
事件,并将事件处理程序设置为:

void maskedTextBox1_TextChanged(object sender, System.EventArgs e)
{
    string input = this.maskedTextBox1.Text;

    StringBuilder outputBuilder = new StringBuilder(input.Length);
    char[] allowedCharacters = new char[] { '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    foreach (char c in input)
    {
        if (allowedCharacters.Contains(c))
        {
            outputBuilder.Append(c);
        }
    }

    string output = outputBuilder.ToString();
    if (!input.Equals(output))
    {
        this.maskedTextBox1.Text = output;
    }
}

第一个问题算法解决方案

检查索引是否为偶数且>0,并将字符向左移动以为“|”字符留出空间

for (int i=0; i<input.length; i++)
{
    var c = input[i];
    
    if (i % 2 == 0 && i>0)
    {
        
        for(int j=input.length-1; j>=i; j++) input[j+1] = input[j];
        input[i] = '|';
        textBox1.Text = input;
    }
}
for(int i=0;i0)
{
对于(intj=input.length-1;j>=i;j++)输入[j+1]=input[j];
输入[i]=“|”;
textBox1.Text=输入;
}
}

确保输入中有足够的空间(如果是基元类型集合)

当前代码的一个问题是,即使以编程方式更新文本框,文本更改事件也会激发。避免这种情况的一种方法是检测文本更改是由您引起的。在下面的示例中,我通过检查“|”是否在字符串末尾的2个字符内完成了此操作

使用StringBuilder以增量方式构建字符串,以避免生成多个字符串对象

如果你真的想弥补这一点的优化,mod操作可以用提取最低有效位的掩码来代替

  private void textBox1_TextChanged(object sender, EventArgs e)
  {
     string input = textBox1.Text;
     // did I cause this event to fire? if not, parse the input
     if (input.LastIndexOf("|") < input.Length - 2)
     {
        input = input.Replace("|", "");
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < input.Length; i++)
        {
           stringBuilder.Append(input[i]);
           if (i % 2 == 1)
           {
              stringBuilder.Append("|");
           }
        }
        textBox1.Text = stringBuilder.ToString();
        textBox1.Select(textBox1.Text.Length, 0);
     }
  }
private void textBox1\u TextChanged(对象发送者,事件参数e)
{
字符串输入=textBox1.Text;
//我是否引发了此事件?如果没有,请分析输入
if(input.LastIndexOf(“|”)
但第一个问题没有解决,更重要的是:(第一个问题是什么?这两个问题(屏蔽和只允许十六进制)都可以通过此控件解决。无需对事件处理程序进行编码。其中一个带有“每两个字符后,它应该自动在其中添加一个”|”。但我不知道如何做到这一点”。您也可以使用此控件实现这一点。您是否阅读了链接的漫游?您是否可以更具体一点?我是C#新手:(顺便问一下,这不适用于右键单击粘贴。为什么允许或需要这样的约束?