【问题标题】:Accept numbers only for text box [duplicate]仅接受文本框的数字[重复]
【发布时间】:2018-09-23 19:37:50
【问题描述】:

在 VB 的 ASP.NET 项目上工作的学生试图限制用户使用 CASE 语句在文本框中输入任何接受数字,但我不断收到 System.EventArgs 错误。

我的代码:

 Protected Sub ValueBox1_TextChanged(sender As Object, e As EventArgs) Handles ValueBox1.TextChanged
    Select Case e.KeyChar
    Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", vbBack
    e.Handled = False
    Case Else
    e.Handled = True
    End Select
    End Sub

Errors = 'KeyChar' 和 'Handled' 不是 'System.EventArgs' 的成员

我已尝试将其更改为 KeyPress 事件

 (ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)Handles TextBox1.KeyPress

但是找不到消息更改为“KeyPress”。我知道我很接近但尝试了很多其他更改和建议,感觉就像我在绕圈子。

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    如您所见,EventArgs 类型(所有其他 <Something>EventArgs 的基本类型)不包含 .KeyChar 属性(实际上,根本没有属性)。
    服务器端KeyPressed事件在Web应用中是没有用的。
    因此,您的选择是在客户端(在浏览器中)检查输入,并在服务器端进行额外验证。

    1. <asp:TextBox ID="txtNum" runat="server" TextMode="Number" min="0" max="20" />
      渲染<input name="txtNum" type="number" id="txtNum" min="0" max="20">
      允许数字,+, -, .

    2. <asp:TextBox runat="server" TextMode="SingleLine" ID="txtNum2" /> <asp:RangeValidator runat="server" ID="valNum2" ControlToValidate="txtNum2" Display="Dynamic" ErrorMessage="Numbers only" MaximumValue="20" MinimumValue="0" Type="Integer"></asp:RangeValidator>
      验证输入它改变并且不允许在错误修复之前提交表单。

    3. 使用 javascript 检查客户端的每个按键。

      <asp:TextBox runat="server" ID="txtNum3" OnTextChanged="txtNum3_TextChanged" onkeydown="return checkKey(event)" />
      <script>
          function checkKey(evt) {
              if ('0123456789'.indexOf(evt.key) == -1)
                  return false;
              return true;
          }
      </script>
      

    另外检查/验证服务器端的输入。

    Protected Sub txtNum3_TextChanged(sender As Object, e As EventArgs) Handles txtNum3.TextChanged  
          If Regex.IsMatch(txtNum3.Text, "\D") Then ''// \D - any non-digit character
            ''//do something to disapprove input
          End If
    
    
    End Sub
    

    【讨论】:

    • 嗨,Alex,感谢您提供非常有用的信息。就在我回到这里之前,我一直在搜索,忽略了我的挫败感,通过更改 ASP 页面与 VB 代码,我发现了与您提到的类似的东西。我用 这给了我想要的效果,这样我就可以继续前进并完成我的项目。
    • 只要确保 .keyCode 已被弃用 developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode event.key 推荐。
    • 亲爱的投票者,请解释问题所在。
    • @the1fan 如果您希望使用内联脚本,那么 onkeydown="return '0123456789'.indexOf(event.key)&gt;-1;" 效果更好。
    【解决方案2】:

    在“这是我之前准备的一个”的经典模式中......

    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If Not (e.KeyChar >= "0" And e.KeyChar <= "9") Then
            e.KeyChar = Chr(0)
        End If
    End Sub
    

    在您的帖子中,您将 ValueBox1 替换为 TextBox1。而KeyChar 对通用EventArgs 无效,但对特定KeyPressEventArgs 有效。

    如果这在您的上下文中不起作用,请检查您的解决方案参考,因为此代码过去曾为我工作过。

    【讨论】:

    • 我的错,应该是“ValueBox1”而不是“TextBox1”。当我使用你拥有的东西时,我得到了两个错误:
    • 错误 1 ​​事件 'KeyPress' 找不到。错误 2 表达式是一个值,因此不能作为赋值的目标。
    • If Not (IsNumeric(e.KeyChar)) Then e.Handled = True End If.
    猜你喜欢
    • 2013-12-15
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2011-06-15
    相关资源
    最近更新 更多