我正在使用c#winform。
我有2维文本框数组我希望他们只接受来自A-I的信件我已经创建了方法,但只适用于一个文本框。
这是我的代码:
textbox[i,j].Validated+=new EventHandler(TextBox_KeyPress);
private void TextBox_KeyPress(object sender, EventArgs e)
{
bool bTest = txtRegExStringIsValid(textbox[1,1].Text.ToString());
ToolTip tip = new ToolTip();
if (bTest == false)
{
tip.Show("Only A-I", textbox[1,1], 2000);
textbox[1,1].Text = " ";
}
}
private bool txtRegExStringIsValid(string textToValidate)
{
Regex TheRegExpression;
string TheTextToValidate;
string TheRegExTest = @"^[A-I ]+$";
TheTextToValidate = textToValidate;
TheRegExpression = new Regex(TheRegExTest);
if (TheRegExpression.IsMatch(TheTextToValidate))
{
return true;
}
else
{
return false;
}
}
任何人都可以指导我应该做什么使这个代码适用于所有文本框?
答案 0 :(得分:2)
如果这适用于文本框[1,1],您可以将private void TextBox_KeyPress(object sender, EventArgs e)
注册为所有文本框的事件处理程序,而不是textbox[1,1]
您可以使用((TextBox)sender)
答案 1 :(得分:1)
我希望文本框只接受来自a-i的字母,实际上我正在尝试制作数独
与正则表达式相比,更多更简单的解决方案,您甚至不需要处理Validated
event来实现它。
在这种情况下,只有某些字符要阻止用户输入,处理KeyDown
event是一个很多更好的解决方案。用户获得立即反馈,表明他们尝试输入的信件未被接受。替代方案(Validating
和Validated
事件)实际上等到用户尝试离开文本框以粗鲁地警告他们输入无效。特别是对于游戏来说,这往往会打破注意力,并不是特别方便用户。
这样做也会使个别文本框引发事件变得无关紧要。相反,您将以相同的方式处理所有文本框 - 完全忽略所有无效输入。
这就是我要做的事情:
首先,将处理程序方法附加到文本框的KeyDown
event。您可以从设计器的“属性”窗口执行此操作,也可以通过代码执行此操作,如问题中所示:
textbox[i,j].KeyDown += TextBox_KeyDown;
然后,您需要将逻辑放入事件处理程序方法中,该方法确定用户刚按下的键是否在允许的范围内(A到I),或者在其外部:
private void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// Determine if the keystroke was a letter between A and I
if (e.KeyCode < Keys.A || e.KeyCode > Keys.I)
{
// But allow through the backspace key,
// so they can correct their mistakes!
if (e.KeyCode != Keys.Back)
{
// Now we've caught them! An invalid key was pressed.
// Handle it by beeping at the user, and ignoring the key event.
System.Media.SystemSounds.Beep.Play();
e.SuppressKeyPress = true;
}
}
}
如果您想限制用户只输入一个字母,您可以添加代码来处理上述方法中的代码,或者您可以采用更简单的路径并让文本框控件自动为您处理。为此,请在设计器中或通过代码将文本框的MaxLength
property设置为true
:
textbox[i,j].MaxLength = true;
答案 2 :(得分:0)
检查sender
的文字,而不是textbox[1,1]
的内容。
答案 3 :(得分:0)
使用事件处理程序的sender
参数来标识负责该事件的文本框。
答案 4 :(得分:0)
第一件可以帮助您的事情是将事件的发件人转换为TextBox,如下所示:
(另外,正如Cody Gray所说,这是一个TextBox_Validated事件,而不是KeyPress事件,所以我已经适当地重命名了它)
private void TextBox_Validated(object sender, EventArgs e)
{
TextBox tb = sender as TextBox()
if (sender == null)
return;
bool bTest = txtRegExStringIsValid(tb.Text.ToString());
ToolTip tip = new ToolTip();
if (bTest == false) {
tip.Show("Only A-I", tb, 2000);
tb .ext = " ";
}
接下来,您需要为每个文本框实际进入该代码。有两种明显的方法,您可以将事件处理程序分配给数组中的每个文本框,也可以使用自定义文本框,始终执行此验证,然后将其添加到数组中。
将eventhandler分配给文本框
foreach(var tb in textbox)
{
tb.Validated += new EventHandler(TextBox_KeyPress);
}
创建自定义文本框控件
创建自定义文本框控件(将用户控件添加到项目中),然后就像使用普通文本框一样使用它。
public partial class ValidatingTextBox: TextBox
{
public ValidatingTextBox()
{
InitializeComponent();
}
protected override void OnValidating(CancelEventArgs e)
{
bool bTest = txtRegExStringIsValid(this.Text.ToString());
ToolTip tip = new ToolTip();
if (bTest == false)
{
tip.Show("Only A-I", this, 2000);
this.Text = " ";
}
}
private bool txtRegExStringIsValid(string textToValidate)
{
// Exactly the same validation logic as in the same method on the form
}
}