开发者

How to validate array of text boxes

开发者 https://www.devze.com 2023-02-28 01:12 出处:网络
I am using c# winform. I have 2dimensional array of text boxes I want them to accept only Letters from A-I I\'ve created the method but that works for only one text box.

I am using c# winform.

I have 2dimensional array of text boxes I want them to accept only Letters from A-I I've created the method but that works for only one text box.

Here is my code:

textbox[i,j].Validated+=new EventHandler(TextBox_KeyPress);

private void  TextBox_KeyPress(object sender, EventArgs e)
{
    bool bTest = txtRegExStringIsValid(textbox[1,1].Text.ToString());
    ToolTip tip = new ToolTip();
      if (bTest == false)
    {

        tip.Show("Only A-I", textbox[1,1], 2000);
        textbox[1,1].Text = " ";
    } 
 }

private bool txtRegExStringIsValid(string textToValidate)
{
    Regex TheRegExpression;
    string TheTextToValidate;
    string TheRegExTest = @"^[A-I ]+$";
    TheTextToValidate = textToValidate;
    TheRegExpression = new Regex(TheRegExTest);

    if (TheRegExpression.IsMatch(TheTextToValidate))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Can anyone please guide what should I do make this code work for a开发者_开发知识库ll text boxes?


if this works for textbox[1,1] you could register your private void TextBox_KeyPress(object sender, EventArgs e) as eventhandler for all your textboxes and instead of textbox[1,1] you could use ((TextBox)sender)


i want text boxes to accept only letters from a-i actually i am trying to make sudoku

There's a much simpler solution than regular expressions, and you don't even need to handle the Validated event to implement it.

In a situation like this, where there are only certain characters that you want to prevent the user from entering, handling the KeyDown event is a much better solution. The user gets immediate feedback that the letter they tried to enter was not accepted. The alternative (the Validating and Validated events) actually wait until the user tries to leave the textbox to rudely alert them that their input was invalid. Especially for a game, this tends to break concentration and isn't particularly user-friendly.

Doing it this way also makes it irrelevant which individual textbox raised the event. Instead, you will handle it the same way for all of the textboxes—by completely ignoring all invalid input.

Here's what I'd do:

  1. First, attach a handler method to your textbox's KeyDown event. You can do this from the Properties window in the designer, or you can do it through code, as you have in the question:

    textbox[i,j].KeyDown += TextBox_KeyDown;
    
  2. Then, you need to put the logic into your event handler method that determines if the key that the user just pressed is in the allowed range (A through I), or outside of it:

    private void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)        
    {
        // Determine if the keystroke was a letter between A and I
        if (e.KeyCode < Keys.A || e.KeyCode > Keys.I)
        {
            // But allow through the backspace key, 
            // so they can correct their mistakes!
            if (e.KeyCode != Keys.Back)
            {
                // Now we've caught them! An invalid key was pressed.
                // Handle it by beeping at the user, and ignoring the key event.
                System.Media.SystemSounds.Beep.Play();
                e.SuppressKeyPress = true;
            }
        }
    }
    

If you want to restrict the user to typing in only one letter, you can add code to handle that in the above method, or you can take an even simpler route and let the textbox control handle it for you automatically. To do that, set the MaxLength property of the textbox to true, either in the designer or through code:

textbox[i,j].MaxLength = true;


Check the text of the sender instead of whatever textbox[1,1] is.


Use the sender parameter of the event handler to identify the textbox responsible for the event.


The first thing that will help you is casting the sender of your event to a TextBox like this:

(Also, as Cody Gray said, this is a TextBox_Validated event, not a KeyPress event so I've renamed it appropriately)

private void TextBox_Validated(object sender, EventArgs e)        
{        
        TextBox tb = sender as TextBox()

        if (sender == null)
            return;

        bool bTest = txtRegExStringIsValid(tb.Text.ToString());
        ToolTip tip = new ToolTip();                      
        if (bTest == false)                    {                        
            tip.Show("Only A-I", tb, 2000);                        
        tb .ext = " ";     
}

Next you need to actually get into that code for every textbox. There are two obvious approaches to that, you can either assign the eventhandler to each textbox in the array or you can use a custom textbox which always does this validation and then add that to your array.

Assign eventhandler to textboxes

foreach(var tb in textbox)
{
    tb.Validated += new EventHandler(TextBox_KeyPress);
}

Create custom textbox control

Create the custom text box control (Add a user control to the project) and then just use it exactly as you would a normal textbox.

public partial class ValidatingTextBox: TextBox
{
    public ValidatingTextBox()
    {
        InitializeComponent();
    }

    protected override void OnValidating(CancelEventArgs e)
    {
        bool bTest = txtRegExStringIsValid(this.Text.ToString());
        ToolTip tip = new ToolTip();
        if (bTest == false)
        {
            tip.Show("Only A-I", this, 2000);
            this.Text = " ";
        } 
    }

    private bool txtRegExStringIsValid(string textToValidate) 
    { 
       // Exactly the same validation logic as in the same method on the form
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消