Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 294
  • Last Modified:

KeyDown slower by 1 move/key

If txtDOB.Text.Trim.Length = 0 Then
        picDOB.Image = Image.FromFile("error.gif")
Else
        picDOB.Image = Image.FromFile("ok.gif")
End If

With the above in KeyDown method for txtDOB, if i delete the spaces in the textbox, then press a character, it will still display as error, unless I type in another character, which now knows OK.

However if all is in the KeyUp method, all is fine, but if I hold down a letter it will only execute my codes after spamming, which is useless.
0
Sharalynn
Asked:
Sharalynn
  • 5
  • 3
1 Solution
 
Joel CoehoornDirector of Information TechnologyCommented:
KeyDown fires before the key is added to the textbox, so that if you want to you can refuse the character.  It how you can do thing like disallow symbols in a textbox without using a mask.

I don't understand why spamming for KeyUp represents a problem-- it they spam a bunch of text the field still isn't valid.  Instead of just checking for at least one character, try this instead on the KeyUp event to validate the field

    If IsDate(txtDOB.Text.Trim) Then
        picDOB.Image = Image.FromFile("ok.gif")
    Else
        picDOB.Image = Image.FromFile("error.gif")
    End If
0
 
SharalynnAuthor Commented:
Well because you see, I also need a count of the length of the textbox text so that I can remove the picture when txtDOB.textlength is 0.

So example if I have "a" in my textbox, there is an error. If I press backspace, the a is gone, but there is still an error. If I type "a" again, it will still have the error unless I type another "a" again. This is for KeyDown.

For KeyUp, all works fine, but if the user holds "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" right from the start, no validation is done until he releases up the key. NOT to mention that if there is some validation done and a label is displayed, it would 'lag' out. You understand what I am trying to say?
0
 
Joel CoehoornDirector of Information TechnologyCommented:
> Well because you see, I also need a count of the length of the textbox text so that I can remove the picture when txtDOB.textlength is 0.

The code I gave will remove the picture when txtDOB.Text.Length == 0

> So example if I have "a" in my textbox, there is an error. If I press backspace, the a is gone, but there is still an error. If I type "a" again, it will still have the error unless I type another "a" again. This is for KeyDown.

'a' is not a valid date: you *want* it to give an error there.  

> For KeyUp, all works fine, but if the user holds "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" right from the start, no validation is done until he releases up the key. NOT to mention that if there is some validation done and a label is displayed, it would 'lag' out. You understand what I am trying to say?

The code I gave you won't do any validation until the user lets up- no lag.  At that point, 'aaaaaaaaaaaaaaaaaaa' is not valid, which is correct.  Have you tried the code?
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
SharalynnAuthor Commented:
Hi, thank you for your replies.

The code you gave did not state textlength=0 and remove the picture. I did not try your code as I have more textboxes that need specific validations including certain string format then I must have. The code that you provide only caters for Date validation only.

So the main thing is, is there any KeyXXX that will register the down button immediately(and the character) and so I can then validate it?
0
 
Joel CoehoornDirector of Information TechnologyCommented:
This code will remove the picture if there is no text, because an empty string is not a valid date.  But I understand the desire to have a more generic validation method.

In that case, there is no event that will just give you the whole string on key down.  However, you do have easy access to the existing string, and you get a keycode that can be translated and applied to the existing string:

    Private Sub KeyDownValidation(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        'first get easy to use textbox reference
        Dim box As TextBox = DirectCast(sender, TextBox)
        Dim length As Integer = box.Text.Length

        'then find out how this character will effect the length
        If e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Delete Then
            length -= 1
        ElseIf box.Multiline = False AndAlso (e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Return) Then
            'if it's a single line text box, enter/return have no effect- do nothing
        Else
            Dim s As String = Chr(e.KeyValue)
            s.Trim()
            length += s
        End If

        '  Create a function to find the picture box based on the name of the textbox
        '  should be easy enough as long as you follow good naming conventions
        Dim pic As PictureBox = Nothing
        'pic = GetPictureBoxByName(box.Name)

        'now we can validate the result
        If length >= 1 Then
            'validation succeeds
            pic.Image = Image.FromFile("ok.gif")
        Else
            'validation fails
            pic.Image = Image.FromFile("error.gif")
        End If
    End Sub

Some things to note here:  
    * You link that method to your textboxes using the AddHandler keyword.  
    * I left implementing GetPictureBoxByName() to you, but it should be a fairly simple thing to do.
    * You should load the Gifs once and keep them in memory, rather than reading them from file each time.
    * Have you looked at the ErrorProvider component?  It will do most of this for you.

0
 
Joel CoehoornDirector of Information TechnologyCommented:
Forgot to account for the need to .Trim() the string.  This adds some complexity, since the result could depend on the location of the cursor.  However, the premise is still the same.
0
 
SharalynnAuthor Commented:
Thanks, I will take a look at your code. I am not using ErrorProvider as I am not comfortable with it.

You mentioned "You should load the Gifs once and keep them in memory, rather than reading them from file each time.", any examples on that? I am using embedded resource instead of FromFile now.
0
 
Joel CoehoornDirector of Information TechnologyCommented:
Embedded resource should be good enough.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now