2012-02-07 3 views
0

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

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

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

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

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}"); 
      } 
     } 

ответ

1

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

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);

+0

я думаю для этого тогда, я не знаю, как ссылаться на имя следующего текстового поля. вы увидите из функции, я принимаю отправителя как текстовое поле и ссылаюсь на него как на элемент управления. поэтому, если первое текстовое поле является 'textbox1', я не знаю, как изменить фокус на' textbox2', используя мою текущую настройку. – ikathegreat

+1

Я отредактировал свой ответ, чтобы показать, как сосредоточиться на следующем элементе управления в форме табуляции формы, не зная, какой контроль он опережает время. Обратите внимание, что если у вас есть групповые или другие элементы управления контейнером в форме, возможно, вам придется изменить приведенный выше код, чтобы принять это во внимание. –

+0

muahahaha это работает отлично, спасибо !!!! снова в деле.... – ikathegreat

 Смежные вопросы

  • Нет связанных вопросов^_^