0

こんにちは、コードのどこが間違っているかはわかっていますが、それを修正する方法がわかりません...

TextChanged イベントで、次のことを行う (行うはずの) 検証関数を呼び出します。

  • 文字以外の文字を削除する
  • 入力した文字を大文字に変換する
  • テキスト ボックスに 1 文字のみを許可する
  • SendKeys を使用してタブ インデックスを増やします (次のテキスト ボックスに移動します)。

問題は、それが textchanged イベントにあるためです。2回タブを押すのを防ぐために、私はそれと戦おうとしています(それはやっています)。ステップスルーすると、入力された最初の文字が最初の textchanged イベントであるため、許可されていない文字の場合、関数が再度呼び出されますが、文字の場合、ToUpper が再度変更されている可能性があるため、タブが 2 回送信されます。 . 何か案は?複雑なブール値を設定せずにこれを行う方法があることを知っています....

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

1 に答える 1

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

于 2012-02-07T05:48:32.423 に答える