2012-06-10 77 views
0

我尝试下面的代码:如何只允许-ZA-Z字符

Private Sub txtName_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtName.KeyPress 
    ' allow upper and lower case A-Z, and backspace 
    If Not Chr(KeyAscii) Like "[A-Za-z]" And KeyAscii <> 8 Then KeyAscii = 0 
End Sub 

但它给:

'KeyAscii' 未声明。由于其保护级别,它可能无法访问。

关于如何仅允许字母表的任何想法?

回答

5

它看起来像你试图逐字翻译VB6代码。你需要重新学习语言,除了名字之外,VB.NET完全不同。

在您的具体情况下,KeyAscii已被KeyPressedEventArgs替换,其中有两个成员:KeyCharHandled

此外,.NET区分字符和字符串(=字符集合),您不能简单地采取一个字符并将Like运算符应用到它,也不应该。

相反,做到以下几点:

If Character.IsLetter(e.KeyChar) Then 
    e.Handle = True 
End If 

设置HandledTrue一般具有在VB6设置KeyAscii 0相同的效果(阅读文件!)。

此外,由于您显然只是在切换,请确保在项目选项中同时启用Option ExplicitOption Strict,并使其成为Visual Studio设置中的其他项目的默认值。这有助于为您捕捉相当多的错误。

最后,此代码对可用性不好。一般认为字段应该是而不是以这种方式约束用户输入(并且它也不安全:如果用户使用复制&粘贴来输入无效文本会怎么样?)。相反,您应该在文本框'Validating event中测试输入的有效性,因为它存在这个目的。

1

KeyAscii定义在哪里?看起来它超出了范围。

由于您不能将它作为参数传入,因此请先尝试全局声明它。那么你应该可以在你的方法中访问它。

免责声明:虽然我以前使用过它,但我对VB.NET的知识却非常有限。

+1

即使你宣布它,它不会有一个有意义的价值...... –

+0

你说得对。这只是我对VB.NET谈话的经验不足。谢谢 –

2

应使用以下正则表达式:

Dim reg_exp As New RegExp 
reg_exp.Pattern = "^[a-zA-Z]*$" 
If reg_exp.Test(txtName.Text.Trim()) Then 
    MessageBox.Show("Input name is correct") 
Else 
    MessageBox.Show("Input name is not correct") 
End If 
+0

不,你不应该。为什么?它解决了一个不存在的问题('Like'也可以,但实际上它们都不适用于字符)。此外,形式为'如果某些事情然后返回真实的否则返回错误'的代码是不好的。你应该直接写'Return Something',不需要多余的'If'。 –

+0

我只是想给他看一个使用正则表达式的例子,好吗? – Karamafrooz

+1

和我的代码绝对正常工作! – Karamafrooz

1
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As  System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress 

Dim keyAscii As Char 
keyAscii = e.KeyChar 

     If keyAscii > Chr(64) And keyAscii < Chr(91) Then 
     'char is A-Z 

    End If 

    If keyAscii > Chr(96) And keyAscii < Chr(123) Then 
     'char is a-z 
    End If 
End Sub 
+0

如果你坚持要手动完成,你至少应该用'AndAlso'而不是'And':第一个是逻辑运算符,后者是一个按位运算符。 –

0
If (Microsoft.VisualBasic.Asc(e.KeyChar) < 65) _ 
Or (Microsoft.VisualBasic.Asc(e.KeyChar) > 122) Then 
e.Handled = True 
End If 
If (Microsoft.VisualBasic.Asc(e.KeyChar) = 8) Then 
e.Handled = False 
End If 
+0

如果你添加一些解释来解释为什么你的代码可以解决问题会更好。 –