仅复制剪贴板中的字母到文本框

时间:2014-06-12 14:20:58

标签: c# .net regex

我正在努力只将信件从剪贴板复制到文本框。我试图过滤剪贴板并将其替换为只带有正则表达式的字母,但我希望剪贴板保持不变。

我试过了:

private void Schowek()
    {
        string schoweczek;
        if (Clipboard.ContainsText())
        {
            schoweczek = Clipboard.GetText();
            var schoweczek2 = Regex.Replace(schoweczek, @"[\d-]", string.Empty);
            Clipboard.SetText(schoweczek2);

        }
    }

private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            Schowek();
        }
    }

但我认为这不是最有效的方式。

更新: 我已经想到了这样的事情,因为它没有工作:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string checkstr=textBox1.Text;
        char[] checkchar = checkstr.ToCharArray();

        for (int i = 0; i < checkstr.Length; i++)
        {
            if (Char.IsLetter(checkchar[i])){


            }
            else
            {
                checkchar[i] = '\0';

            }

        }

       checkstr=String.Join("", checkchar);
       textBox1.Text = textBox1.Text + checkstr;

4 个答案:

答案 0 :(得分:1)

不是试图破解本机粘贴功能以粘贴剪贴板中的内容,或者更改剪贴板的内容,而是只需订阅文本框的事件并“更正”它在那里的值。 / p>

如果您可以允许用户在文本框中输入任何内容,然后在移动到下一个控件后清除值,请使用仅在您移动到下一个字段后才会触发的验证事件。

如果您想要即时更正,请使用文本更改事件。但要注意在此事件中运行的代码量,因为当用户输入代码时,它会快速触发多次。如果可能,请使用仅在文本框失去焦点后触发的事件。

无论您想要做什么,都无需随时触摸剪贴板。

[编辑] 另外,要小心禁止人名中的字符。很多人的名字中都有数字和奇怪的字符。 Falsehoods Programmers Beleive About Names

答案 1 :(得分:0)

为特定文本框实例实现此目的的一种非常常见的方法是:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
   // pseudo-code, fell free to implement it yourself.
   if(!IsAllowed(e.KeyChar))
       e.Handled = true;
}

private readonly char[] allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
private bool IsAllowed(char c)
{
    return allowed.Contains(c);
}    

<强>更新

您可以使用MaskedTextBox,但我认为您的老师会考虑这种作弊行为;)

我能想到:

private bool reenter = false;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (reenter || String.IsNullOrEmpty(textBox1.Text)) return;

    var in = textBox1.Text.ToCharArray(); 
    var out = Filter(input).ToArray();
    var output = new String(out);

    if (!textBox1.Text.Equals(output))
    {
        reenter = true;
        textBox1.Text = output;
        reenter = false;
    }
}

private IEnumerable<char> Filter(IEnumerable<char> input)
{
     foreach(var c in input)
       if (IsAllowed(c))
           yield return c;
}

更新2

我刚刚修改了你自己的解决方案。

首先,您必须防止TextChanged事件多次触发(如果您从代码中设置Text,它也会触发)。您可以设置一个布尔变量,就像我在上一个示例中使用reenter所做的那样,或者比较文本和新文本,并且只有设置它的值(如果不同)。

将数组内的值设置为'\0'是错误的,因为\0是字符串终止符,之后的每个字符都被忽略。因此,如果您从剪贴板粘贴a1b,则会获得一个字符数组{&#39; a&#39;,&#39; \ 0&#39;&#39; b&#39; }。 NET不需要字符串终止符,因此您可以将结果看作&#34; a \ 0b&#34;但是,如果您设置文本框值,则只会a而不是ab

无论如何,这是我的解决方案。它使用另一个数组,我也记住SelectionStart以防止光标在文本更改后跳转到第一个位置。

private void textBox1_TextChanged(object sender, EventArgs e)
{
        string checkstr = textBox1.Text;
        char[] checkchar = checkstr.ToCharArray();
        char[] newchar = new char[checkstr.Length];

        int pos = 0;
        for (int i = 0; i < checkstr.Length; i++)
        {
            if (Char.IsLetter(checkchar[i]))
            {
                newchar[pos] = checkchar[i];
                pos++;
            }
        }

        checkstr = String.Join("", newchar);
        if (textBox1.Text != checkstr)
        {
            var start = textBox1.SelectionStart;
            textBox1.Text = checkstr;
            textBox1.SelectionStart = start;
        }

}

答案 2 :(得分:0)

试试这段代码

string strClip = Clipboard.GetText();
string textvalue  = Regex.Replace(strClip, @"\d", "");

首先从剪贴板复制文本,用#34替换数字;&#34;。工作正常我测试它。

答案 3 :(得分:0)

采取另一种观点: 考虑“正在”文本框并观察输入或粘贴的内容。然后删除任何不允许的内容或(更好的用户体验):允许任何输入,但拒绝“确定”并显示错误,直到只有有效输入。