Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Hex Mask for maskedtextbox input

Tags:

c#

hex

mask

I'm trying to set a hex mask for a textbox. So that only valid hex numbers can be entered. (And ',' and 'ENTER')

It almost works. So far it will only allow small letters from a-f and numbers 0-9, but I can still enter capital letters GHIJKLM. (At first, when program is started it seems to accept one char ex k, but after it has excepted k once it wont be shown after that, until next time you start the program. That's weird.)

Here is a part of code:

private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    // if keychar == 13 is the same as check for if <ENTER> was pressed
    if (e.KeyChar == (char)13)
    {
        // is <ENTER> pressed, send button_click
        button1_Click(sender, e);
    }
    {
        // this will only allow valid hex values [0-9][a-f][A-F] to be entered. See ASCII table
        char c = e.KeyChar;
        if (c != '\b' && !((c <= 0x66 && c >= 61) || (c <= 0x46 && c >= 0x41) || (c >= 0x30 && c <= 0x39) || (c == 0x2c)))
        {
            e.Handled = true;
        }
    }
}

This is how I bind the event:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    this.textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyDown);
}

Could anyone of you wise guys, see what I'm doing wrong?

It's my first small program, so go easy on me :o)

like image 792
user302935 Avatar asked Jul 26 '10 18:07

user302935


1 Answers

This:

c <= 0x66 && c >= 61 

Should be:

c <= 0x66 && c >= 0x61 //hex literal

Note that you're wasting valuable time by looking up hex codes, you can easily compare characters:

if ((c >= 'a') && (c <= 'f'))

As for the first character: you shouldn't bind the KeyPress at the TextChanged event - it is too late! Here's the sequence of events:

  1. Form Loads
  2. ...
  3. User click on a key.
  4. TextChanged triggered, changing the text and binding the event.
  5. User click on a key.
  6. KeyPress triggered.

What you want to do is to bind the event right from the start. The best place is the Form_Load event.
You can also use the Properties window to bind the event at design time

like image 169
Kobi Avatar answered Oct 13 '22 17:10

Kobi