RadMaskedEditBox and cost entry

8 posts, 3 answers
  1. Scott
    Scott avatar
    6 posts
    Member since:
    Nov 2010

    Posted 24 Nov 2010 Link to this post

    I am using the radMasked editBox for currency entry and am having a few issues.
    Mask = c
    MaskType = Numeric

    1. Negative values are not handled nicely.
       The only way to stop a currency field being negative is to press the - sign.
       You should be able to  a. Most importantly select the - sign and press delete or backspace
                                            b. Select all the text including the - sign and type over it (currently the new value is still negative)
                                            c. press the + sign should make it positive

    2. Is there a way to stop the user being able to enter negative values as we don't want them most time, and all i can think to do is try to stop the - keypress before it is filtered to the control.

    3. Another important issue is typing over existing values
    if you have a value of $800.12 entered and you select just the 8 and change it to another number lets say 7 the result is $7.12, it took out the 0's following the 8.
    This is potentially hazardous, a user could easily rush through and not notice the 0's have been removed and then someone could be out quite a bit of money.
  2. Scott
    Scott avatar
    6 posts
    Member since:
    Nov 2010

    Posted 24 Nov 2010 Link to this post

    Another issue i just found is

    4. if you copy a currencey from say notepad with a value like 80.00, then select all the text in the radMaskedEditbox
    and press CTRL+V (paste) the result in the Masked edit box is as follows $080.00.00 note the two decimal points, this can not be achived by simple typing a second decimal so the paste should not allow it. 
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Scott
    Scott avatar
    6 posts
    Member since:
    Nov 2010

    Posted 24 Nov 2010 Link to this post

    And one more.

    5. The MaxLength does not function.
    I have opened the control editor for the RadMaskedEditBox and under the RadMaskedEditBoxItem treenode there is a property for MaxLength, setting this has no effect what so ever.

    We use the RadMaskedEditBox to enter cost fields which are saved to the database so it would be nice to limit these to only values that the SQL server money field will accept, Max length would do the trick quite nicely.

    I know we could add a validation routine to our form to check this and report to the user about invalid values, but even better is them not being able to add them in the first place, and this would save us a lot of repeat code adding validation.

    Is there another way to set the max length or limit the values able to be entered.
  5. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 25 Nov 2010 Link to this post

    Hello Scott,

    There are quite a few questions here so I may need to answer them over a few replies.
    Please see the code below. It is just a RadMaskedEditBox on a form.

    This should address a couple of your issues:
    1: Does not allow minus values
    2: Corrects the copy and paste problem

    I will try and get back to you with a workaround to your other issues.
    Imports Telerik.WinControls
    Imports Telerik.WinControls.UI
    Imports System
      
      
    Public Class Form1
      
        Private WithEvents m_TextBox As RadTextBoxItem
      
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.RadMaskedEditBox1.Mask = "c"
            Me.RadMaskedEditBox1.MaskType = MaskType.Numeric
            Me.RadMaskedEditBox1.MaskedEditBoxElement.TextBoxItem.MaxLength = 5
            m_TextBox = Me.RadMaskedEditBox1.MaskedEditBoxElement.TextBoxItem
        End Sub
      
        Private Sub TextBox_KeyPress(ByVal sender As System.Object, ByVal e As KeyPressEventArgs) Handles m_TextBox.KeyPress
            ' use this code to stop minus being entered
            If e.KeyChar = CChar("-") Then
                e.Handled = True
            End If
        End Sub
      
        Private Sub TextBox_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles m_TextBox.KeyDown
            ' use this to correct the copy paste issue
            Try
                If e.KeyCode = Keys.V AndAlso (e.Modifiers And Keys.Control) <> Keys.None Then
                    Me.RadMaskedEditBox1.Value = Clipboard.GetText()
                    e.Handled = True
                    e.SuppressKeyPress = True
                End If
            Catch ex As FormatException
                e.Handled = False
                e.SuppressKeyPress = False
            End Try
        End Sub
      
    End Class

    hope that helps
    Richard
  6. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 25 Nov 2010 Link to this post

    Hello Scott,

    I tried the internal TextBoxItem for MaxLength as well, but this didn't function as I expected, so the following code has been revised to include a max length functionality.

    I hope this all helps. Please mark as answer anything you found useful and if you need more information, just let me know.

    Richard
    Imports Telerik.WinControls
    Imports Telerik.WinControls.UI
    Imports System
      
      
    Public Class Form1
      
        Private WithEvents m_TextBox As RadTextBoxItem
      
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.RadMaskedEditBox1.Mask = "c"
            Me.RadMaskedEditBox1.MaskType = MaskType.Numeric
            m_TextBox = Me.RadMaskedEditBox1.MaskedEditBoxElement.TextBoxItem
            ' specify the number of digits. In this case 6 = a max of 9,999.99 (6 integer characters)
            Me.RadMaskedEditBox1.MaxLength = 6
        End Sub
      
        Private Sub TextBox_TextChanging(ByVal sender As System.Object, ByVal e As TextChangingEventArgs) Handles m_TextBox.TextChanging
            ' use this to stop long input
            Dim chrArray() As Char
            Dim numbers As Integer
            Dim result As Integer
            chrArray = m_TextBox.Text.ToCharArray
            For intCounter = 0 To chrArray.Length - 1
                If Integer.TryParse(chrArray(intCounter), result) Then
                    numbers = numbers + 1
                End If
                If numbers > Me.RadMaskedEditBox1.MaxLength Then
                    e.Cancel = True
                End If
            Next
        End Sub
      
        Private Sub TextBox_KeyPress(ByVal sender As System.Object, ByVal e As KeyPressEventArgs) Handles m_TextBox.KeyPress
            ' use this code to stop minus being entered
            If e.KeyChar = CChar("-") Then
                e.Handled = True
            End If
        End Sub
      
        Private Sub TextBox_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles m_TextBox.KeyDown
            ' use this to correct the copy paste issue
            Try
                If e.KeyCode = Keys.V AndAlso (e.Modifiers And Keys.Control) <> Keys.None Then
                    Me.RadMaskedEditBox1.Value = Clipboard.GetText()
                    e.Handled = True
                    e.SuppressKeyPress = True
                End If
            Catch ex As FormatException
                e.Handled = False
                e.SuppressKeyPress = False
            End Try
        End Sub
      
    End Class
  7. Answer
    Emanuel Varga
    Emanuel Varga avatar
    1336 posts
    Member since:
    May 2010

    Posted 25 Nov 2010 Link to this post

    Hello Scott,

    Ok, let's take them one by one,
    First, for the Num + sign to make the value positive and for the Num - to make the value negative you can use the following:
    public class CustomMaskedEditBox : RadMaskedEditBox
    {
        public override string ThemeClassName
        {
            get
            {
                return typeof(RadMaskedEditBox).Name;
            }
        }
     
        public CustomMaskedEditBox()
        {
            this.textBoxItem.KeyDown += new KeyEventHandler(TextBoxItem_KeyDown);
             
        }
     
        void TextBoxItem_KeyDown(object sender, KeyEventArgs e)
        {
            double value;
            double.TryParse(this.Value.ToString(), out value);
     
            if (e.KeyValue == 109)
            {
                 
                if (value <= 0)
                {
                    value *= -1;
                    this.Value = value;
                }
            }
     
            if (e.KeyValue == 107) // plus sign, the Keys.oemplus is not recognized as the num + sign
            {
                if (value <= 0)
                {
                    value *= -1;
                    this.Value = value;
                }
            }
        }
    }

    For the copy paste you can use Richards suggestion, it should do what you need.

    Hope this helps, if you have any other questions or comments, please let me know,

    Best Regards,
    Emanuel Varga
    Telerik WinForms MVP

  8. Scott
    Scott avatar
    6 posts
    Member since:
    Nov 2010

    Posted 25 Nov 2010 Link to this post

    Thanks for the quick responses guys,

    these workarounds did fix my problems, I am adding them all to a class that inherits from the radMaskeditBox and making a new currencey text box to use within our program.

    The only real issue we have left was the point 3. from my first post in this thread.

    Following your samples I have also coded a fix to allow deleting the minus sign from the start to make a positive number
    You just add this code to a class inheriting the RadMaskEditBox

        Private Const WM_KEYDOWN As Long = &H100
      

        Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean

            ' If allowing neagative values this is a fix to allow deleting the minus sign
            If m.Msg = WM_KEYDOWN Then
                If m.WParam = Keys.Back Or m.WParam = Keys.Delete Then
                    If Me.Value < 0 Then
                        If Me.SelectedText = "-" Then
                            Me.Value *= -1
                        End If
                    End If

                End If
            End If

            Return MyBase.ProcessKeyPreview(m)
        End Function

  9. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 25 Nov 2010 Link to this post

    Hello,

    Glad that this is all sorted for you and we were able to help.
    Regards,
    Richard
Back to Top
UI for WinForms is Visual Studio 2017 Ready