none
textBox間のフォーカス移動について RRS feed

  • 質問

  • お早うございます,zen73です。「またかァ~!!」といわれそうですがtextBox間のフォーカス移動についての質問です。よろしくお願いします。

    Formに配置している38個のtextBoxは下のとおりです。

    tbxInn             tbxOut

    tbxI[ 1]            tbxO[1]

    tbxI[ 2]            tbxO[2]

    ……               ……    *tbxI1~tbxI18,tbxI1~tbxI18はそれぞれ

    tbxI[18]     tbxO[18]   groupBoxの中に配置しています。

    「dobon.net」さんのコードをそのまま使わさせていただいてみました。

    コード ブロック

            private void frm9SetDlg_Load(object sender, EventArgs e)
            {
                //キーイベントをフォームで受け取る
                this.KeyPreview = true;
                //KeyUpイベントハンドらを追加
                this.KeyUp +=new KeyEventHandler(frm9SetDlg_KeyUp);

            } 

           

            private void frm9SetDlg_KeyUp(object sender, KeyEventArgs e)
            {
                //Enterキーが押されているか確認
                if (e.KeyCode == Keys.Enter)
                {
                    //あたかもTabキーが押されたかのようにする
                    //Shiftが押されているときは前のコントロールのフォーカスを移動
                    this.ProcessTabKey(!e.Shift);
                    e.Handled = true;
                }
            }   

     

    このとき,フォーカスの移動がなぜか1つ飛ばしになってしまいます。

    tbxInn → tbxI[ 2] → tbxI[ 4] → tbxOut → tbxO[ 2] → tbxO[ 4]

    → tbxI[ 1] → tbxI[ 3] → tbxI[ 5] → tbxO[ 1] → tbxO[ 3] →  

    (tbxInnの値が例えば5の時は,tbxI[ 6]~tbxI[18]は.visible=falseとしています)

     

    どうして1つ飛ばしになるのかの理由がわからず対策も立てられないでいます。

    (TabOrderをいろいろいじってみたのですが状況は変わりませんでした)

     

    それでいまは下のコードでしのいでいますが,

    tbxInn → tbxI[ 1] → tbxI[ 2] → tbxI[ 3] → tbxI[ 4] → tbxI[ 5] → tbxOut

    となるようにする方策をお尋ねします。

     

    コード ブロック

            private void frm9SetDlg_Load(object sender, EventArgs e)
            {

          for (int i = 1; i < this.tbxI.Length; i++)
                    this.tbxI[i].KeyUp += new KeyEventHandler(this.tbxI_KeyUp);
            } 

     

            private void tbxI_KeyUp(object sender, KeyEventArgs e)
            {
                //クリックしたラベルのインデックス番号
                int index;
                index = returnIndexI(sender);
                if (index == int.Parse(tbxInn.Text))
                    tbxOut.Focus();
                else
                    tbxI[index + 1].Focus();
            }
            //ラベルのインデックス番号を取得して返す
            private int returnIndexI(object sender)
            {
                int index = -1;
                for (int i = 1; i < tbxI.Length; i++)
                {
                    if (tbxI[i].Equals(sender))
                    {
                        index = i;
                        break;
                    }
                }
                return index;
            }

     

     

     

     

                  

     

    2007年11月11日 22:36

回答

  • こんにちは、ファクトです。

    試してませんが、考えられる原因としては・・・

     

    1.タブ順がずれてる

    Enterだけではなく、Tabキーで移動した場合にも、1つ飛ばしになっているようなら、タブ順の設定が間違っているだけでしょう。各テキストボックスのTabIndex値を確認してみて下さい。

     

    2.イベントが2回動いている

    フォームデザイナ等で、frm9SetDlgのKeyUpイベントにfrm9SetDlg_KeyUpを登録してあり、その影響でイベント処理が2回行なわれているとか。デザイナで設定をしらべたり、frm9SetDlg.Designer.csを見てみたり、デバッカでブレイクポイントをはったりすれば、調査できると思います。

     

    と、いったところでしょうか。

    2007年11月12日 0:04

すべての返信

  • こんにちは、ファクトです。

    試してませんが、考えられる原因としては・・・

     

    1.タブ順がずれてる

    Enterだけではなく、Tabキーで移動した場合にも、1つ飛ばしになっているようなら、タブ順の設定が間違っているだけでしょう。各テキストボックスのTabIndex値を確認してみて下さい。

     

    2.イベントが2回動いている

    フォームデザイナ等で、frm9SetDlgのKeyUpイベントにfrm9SetDlg_KeyUpを登録してあり、その影響でイベント処理が2回行なわれているとか。デザイナで設定をしらべたり、frm9SetDlg.Designer.csを見てみたり、デバッカでブレイクポイントをはったりすれば、調査できると思います。

     

    と、いったところでしょうか。

    2007年11月12日 0:04
  • ファクトさん,「frm9SetDlg_KeyUpを登録してあり」が不具合の原因でした。

    どうもありがとうございました。

     

    2007年11月12日 10:43