none
vb.net winform 如何限制 textbox 或者numeric up down 不能被 right click 后 paste 字 RRS feed

  • 问题

  • 如题

    我遇到的问题是 当我 要 输入 Quantity 的时候 我直接在textbox 或者numeric up down 输入时候 是不会有机会打入 decimal point 的

    但是我遇到的bug是 如果我在notepad 打入 123.123.123.13. 有多个point 的 data 然后我cut 与使用right click 后 点击 出现的  paste  到我的 textbox 或者 numeric up down 还是可以paste的到 有decimal point 的data 这是为什么
    有什么办法可以限定我不能在 textbox里 right click paste 有decimal point的data吗?
    【ctrl+v 是肯定不能paste 的到的 但是right click 的paste 可以 ,所以我想限制right click 的paste 不出现】
    2009年3月28日 6:16

答案

  • 如果是这样的话,可以直接自定义数字文本框:
    Public
    
     Class
    
     NumericTextBox
    Inherits TextBox
    Private SpaceOK As Boolean = False

    ' Restricts the entry of characters to digits (including hex),
    ' the negative sign, the e decimal point, and editing keystrokes (backspace).
    Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
    MyBase .OnKeyPress(e)

    Dim numberFormatInfo As NumberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat
    Dim decimalSeparator As String = numberFormatInfo.NumberDecimalSeparator
    Dim groupSeparator As String = numberFormatInfo.NumberGroupSeparator
    Dim negativeSign As String = numberFormatInfo.NegativeSign

    Dim keyInput As String = e.KeyChar.ToString()

    If [Char].IsDigit(e.KeyChar) Then
    ' Digits are OK
    ElseIf keyInput.Equals(decimalSeparator) OrElse keyInput.Equals(groupSeparator) OrElse keyInput.Equals(negativeSign) Then
    ' Decimal separator is OK
    ElseIf e.KeyChar = vbBack Then
    ' Backspace key is OK
    ' else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
    ' {
    ' // Let the edit control handle control and alt key combinations
    ' }
    ElseIf Me .SpaceOK AndAlso e.KeyChar = " " c Then

    Else
    ' Consume this invalid key and beep.
    e.Handled = True
    End If

    End Sub


    Public ReadOnly Property IntValue() As Integer
    Get
    Return Int32.Parse(Me .Text)
    End Get
    End Property


    Public ReadOnly Property DecimalValue() As Decimal
    Get
    Return [Decimal].Parse(Me .Text)
    End Get
    End Property


    Public Property AllowSpace() As Boolean

    Get
    Return Me .SpaceOK
    End Get
    Set (ByVal value As Boolean )
    Me .SpaceOK = value
    End Set
    End Property
    End Class


    周雪峰
    • 已标记为答案 xeraee 2009年3月29日 6:08
    2009年3月28日 10:27
    版主
  • 你好!
         想到两种解决方法:
         1,订阅TextBox的MouseDown事件,在事件处理程序里判断是否是按下了右键,如果是的话,就什么也不做!
         2,直接给TextBox添加一个ContextMenu对象,这个ContextMenu对象不添加任何的菜单项!
         这两种都可以屏蔽右键菜单的啊!
    周雪峰
    • 已标记为答案 xeraee 2009年3月29日 6:08
    2009年3月28日 9:32
    版主

全部回复

  • 你好!
         想到两种解决方法:
         1,订阅TextBox的MouseDown事件,在事件处理程序里判断是否是按下了右键,如果是的话,就什么也不做!
         2,直接给TextBox添加一个ContextMenu对象,这个ContextMenu对象不添加任何的菜单项!
         这两种都可以屏蔽右键菜单的啊!
    周雪峰
    • 已标记为答案 xeraee 2009年3月29日 6:08
    2009年3月28日 9:32
    版主
  • 这2招不错 可是我又想到如果不让使用者paste 字的话 那样对使用者也是很不方便~~
    有没有直接在某事件中 直接删除 (除了数字以外的字) then 我只是留着0~9的数字这样不是更方便吗@@
    2009年3月28日 9:36
  • 你指的什么都不做是什么?



    e.xx 什么??(e=event)



    mousedown取消event 是叫什么@@?
    2009年3月28日 10:21
  • 如果是这样的话,可以直接自定义数字文本框:
    Public
    
     Class
    
     NumericTextBox
    Inherits TextBox
    Private SpaceOK As Boolean = False

    ' Restricts the entry of characters to digits (including hex),
    ' the negative sign, the e decimal point, and editing keystrokes (backspace).
    Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
    MyBase .OnKeyPress(e)

    Dim numberFormatInfo As NumberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat
    Dim decimalSeparator As String = numberFormatInfo.NumberDecimalSeparator
    Dim groupSeparator As String = numberFormatInfo.NumberGroupSeparator
    Dim negativeSign As String = numberFormatInfo.NegativeSign

    Dim keyInput As String = e.KeyChar.ToString()

    If [Char].IsDigit(e.KeyChar) Then
    ' Digits are OK
    ElseIf keyInput.Equals(decimalSeparator) OrElse keyInput.Equals(groupSeparator) OrElse keyInput.Equals(negativeSign) Then
    ' Decimal separator is OK
    ElseIf e.KeyChar = vbBack Then
    ' Backspace key is OK
    ' else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
    ' {
    ' // Let the edit control handle control and alt key combinations
    ' }
    ElseIf Me .SpaceOK AndAlso e.KeyChar = " " c Then

    Else
    ' Consume this invalid key and beep.
    e.Handled = True
    End If

    End Sub


    Public ReadOnly Property IntValue() As Integer
    Get
    Return Int32.Parse(Me .Text)
    End Get
    End Property


    Public ReadOnly Property DecimalValue() As Decimal
    Get
    Return [Decimal].Parse(Me .Text)
    End Get
    End Property


    Public Property AllowSpace() As Boolean

    Get
    Return Me .SpaceOK
    End Get
    Set (ByVal value As Boolean )
    Me .SpaceOK = value
    End Set
    End Property
    End Class


    周雪峰
    • 已标记为答案 xeraee 2009年3月29日 6:08
    2009年3月28日 10:27
    版主