我不希望文本框让用户输入字母和以下字符' - ' ''不止一次,但允许他们按下“输入”#39;键。我使用以下代码:
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-')
{
return;
}
else
{
e.Handled = e.KeyChar != (char)Keys.Back;
MessageBox.Show("X Origin Can Only Accepts Numbers, a Point '.' and a minus '-'", "ATTENTION", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
答案 0 :(得分:0)
我同意来自评论者Sinatr的建议,最好以其他方式显示验证结果。也就是说,从字面上理解你的问题 - 即为了防止用户多次输入甚至允许的字符 - 一个实现可能看起来像这样:
private readonly HashSet<char> _enteredChars = new HashSet<char>();
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
if ((char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-') &&
_enteredChars.Add(e.KeyChar))
{
return;
}
else
{
e.Handled = e.KeyChar != (char)Keys.Back;
MessageBox.Show("X Origin Can Only Accepts Numbers, a Point '.' and a minus '-'", "ATTENTION", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
这使用HashSet<char>
来存储已输入的每个字符。如果按下某个键并且该字符已在该集合中(即Add()
返回false
),则代码将跳转到用于无效字符的相同错误处理。
您当然可以修改上面的示例来处理已经输入的&#34;&#34;场景与&#34;无效字符&#34;不同,即呈现不同的错误消息,甚至忽略那些按键。
另请注意,该集仅在此处添加。您可能希望跟踪字段中字符的删除,同时将其从HashSet<char>
中删除。您可以通过直接检查每个按键的文本字段而不是使用HashSet<char>
来简化此方面。那就是:
TextBox textBox = (TextBox)sender;
if ((char.IsNumber(e.KeyChar) || e.KeyChar == 8 || e.KeyChar == '.' || e.KeyChar == '-') &&
!textBox.Text.Contains(e.KeyChar))
对于非常长的文本条目,这可能比基于HashSet<char>
的方法慢一点。但是否则我怀疑你是否注意到了差异,对于非常短的文本条目,这甚至可能更快。
直接使用textBox.Text
属性的优点是它更简单;您不必担心与目前输入的数据保持同步,因为您始终只是直接检查数据。