只复制字母从剪贴板到文本框
本文关键字:文本 剪贴板 复制 | 更新日期: 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;
}
}