проверить текст текстового поля и увеличить индекс вкладки один раз

привет, я знаю, где мой код работает неправильно, но не знаю, как это исправить...

в событии TextChanged я вызываю свою функцию проверки, которая делает (должна делать) следующее:

  • удалить любой небуквенный символ
  • преобразовать введенную букву в верхний регистр
  • разрешить только один символ в текстовом поле
  • используйте SendKeys, чтобы увеличить индекс вкладки (перейти к следующему текстовому полю)

проблема в том, что, поскольку он находится в событии textchanged, я пытаюсь бороться с ним, чтобы предотвратить его двойное нажатие (что он и делает). потому что, если я прохожу, введенная начальная буква является первым событием изменения текста, тогда, если это недопустимый символ, функция вызывается снова, но если это буква, ToUpper может изменить ее снова, поэтому вкладка отправляется дважды . Любые идеи? я знаю, что есть способ сделать это, не устанавливая какие-то сложные логические значения....

private void validateTextInteger(object sender, EventArgs e)
        {
            TextBox T = (TextBox)sender;
            try
            {
                //Not Allowing Numbers, Underscore or Hash
                char[] UnallowedCharacters = { '0', '1','2', '3', '4', '5','6', '7','8', '9','_','#','%','$','@','!','&',
                                           '(',')','{','}','[',']',':','<','>','?','/','=','-','+','\\','|','`','~',';'};

                if (textContainsUnallowedCharacter(T.Text, UnallowedCharacters))
                {
                    int CursorIndex = T.SelectionStart - 1;
                    T.Text = T.Text.Remove(CursorIndex, 1);
                    //Align Cursor to same index
                    T.SelectionStart = CursorIndex;
                    T.SelectionLength = 0;
                }
            }
            catch (Exception) { }
            T.Text = T.Text.ToUpper();
            if (T.Text.Length > 0)
            {
                 //how do i prevent this (or this function) from getting called twice???
                 SendKeys.Send("{TAB}");
            }
        }

person ikathegreat    schedule 07.02.2012    source источник


Ответы (1)


Вместо того чтобы использовать SendKeys для имитации нажатия клавиши TAB, вы можете найти следующий видимый элемент управления в порядке табуляции и вызвать для него Focus. Что-то вроде этого:

private void FocusOnNextVisibleControl(Control currentControl)
{
    Form form = currentControl.FindForm();
    Control nextControl = form.GetNextControl(currentControl, true);
    while (nextControl != null && !nextControl.Visible && nextControl != currentControl)
    {
        nextControl = form.GetNextControl(nextControl, true);
    }
    if (nextControl != null && nextControl.Visible)
    {
        nextControl.Focus();
    }
}

Чтобы вызвать этот метод, замените SendKeys.Send("{TAB}"); на FocusOnNextVisibleControl(T);.

person Brian Rogers    schedule 07.02.2012
comment
Я думаю, для этого я не знаю, как ссылаться на имя следующего текстового поля. вы увидите из функции, что я принимаю отправителя как текстовое поле и ссылаюсь на него как на элемент управления. поэтому, если первое текстовое поле textbox1, я не знаю, как изменить фокус на textbox2, используя мои текущие настройки. - person ikathegreat; 07.02.2012
comment
Я отредактировал свой ответ, чтобы показать, как сосредоточиться на следующем элементе управления в порядке табуляции формы, не зная заранее, какой элемент управления находится впереди. Обратите внимание, что если у вас есть групповые поля или другие элементы управления контейнерами в форме, вам, возможно, придется изменить приведенный выше код, чтобы учесть это. - person Brian Rogers; 07.02.2012