只复制字母从剪贴板到文本框

本文关键字:文本 剪贴板 复制 | 更新日期: 2023-09-27 18:08:32

我正在努力从剪贴板复制字母到文本框。我试过过滤剪贴板,用正则表达式替换它,但我想保持剪贴板不变。

我试过:

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;

只复制字母从剪贴板到文本框

你可以订阅文本框的一个事件并"更正"它的值,而不是试图破解本地粘贴功能来粘贴剪贴板中的其他内容,或者更改剪贴板的内容。

如果你允许用户在文本框中输入任何东西,然后在他们移动到下一个控件时清除值,那么使用验证事件,它只会在你移动到下一个字段后触发。

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

在任何时候,你都不需要触摸剪贴板来做你想做的事情。

[编辑]另外,要小心人名中不允许使用字符。有很多人的名字里都有数字和奇怪的字符。程序员对名字的误解

试试这个代码

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

首先从剪贴板复制文本,然后用"替换数字。

换个角度看:考虑"成为"文本框,并观察输入或粘贴的内容。然后删除任何不允许的内容或(更好的用户体验):允许任何输入,但拒绝"OK"并显示错误,直到只有有效的输入存在。

对于特定的文本框实例,实现这一点的一种非常常见的方法是:

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 from code,它也会触发)。你可以设置一个布尔变量,就像我在前面的例子中对reenter所做的那样,或者比较文本和新文本,如果不同,只设置它的值。

将数组内的值设置为''0'是错误的,因为'0是字符串终止符,之后的每个字符都被忽略。因此,如果你从剪贴板粘贴a1b,你得到一个字符数组{'a', ''0', 'b'}。. NET不需要字符串终止符,所以你会看到结果为"a'0b",但如果你设置文本框的值,它将只有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;
        }
}