我正在努力只将信件从剪贴板复制到文本框。我试图过滤剪贴板并将其替换为只带有正则表达式的字母,但我希望剪贴板保持不变。
我试过了:
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;
答案 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)
采取另一种观点: 考虑“正在”文本框并观察输入或粘贴的内容。然后删除任何不允许的内容或(更好的用户体验):允许任何输入,但拒绝“确定”并显示错误,直到只有有效输入。