- PR -

複数のコントロールに同じタブインデックスを割当てたい

1
投稿者投稿内容
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-07-03 15:59
VB2005です。
TextBoxA(txtA)とTextBoxB(txtB)とTextBox1(txt1)があります。
txtAとtxtBからtabキーを押したときに、どちらから押してもtxt1に移動するようにしたいのですが
なぜかうまくいきません。

それぞれのタブインデックスは、コントロールを配置したときには
txtAが0、txtBが1、txt1が2 ですのでこれをプロパティで
txtAが0、txtBが0、txt1が2 に直しました。

txtAからtabキーを押すとtxt1に移動します。ですがtxtBから押すとなぜかtxtAに移動します。
タブインデックスのプロパティを変更するだけでは駄目なのでしょうか?
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2008-07-03 16:42
こんにちは。

引用:

chelseaさんの書き込み (2008-07-03 15:59) より:

txtAからtabキーを押すとtxt1に移動します。ですがtxtBから押すとなぜかtxtAに移動します。


この挙動の理由は Control.TabIndex プロパティ に載っています。

なので、
引用:

chelseaさんの書き込み (2008-07-03 15:59) より:

TextBoxA(txtA)とTextBoxB(txtB)とTextBox1(txt1)があります。
txtAとtxtBからtabキーを押したときに、どちらから押してもtxt1に移動するようにしたいのですが
なぜかうまくいきません。


これを実現するためには TextBoxA(txtA)と TextBoxB(txtB)とに KeyUp イベントなりで TextBox1(txt1)に Control.Focus する処理を書く必要があります。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-07-03 16:51
ところで、以下の場合はどういう順序で移動するのでしょうか?
・txt1から、Shift+Tabキーで逆順に辿る
・TabIndexが最も大きいコントロールから、Tabキーでさらに移動する
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-07-03 16:51
こんにちは。

もしくはEnterイベントでお互いのTabStopプロパティを操作するとか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-07-03 17:02
TabIndex で制御するのは保守性に欠けるので、ProcessTabKey メソッドでもオーバーライドして制御した方がマシかなぁと思います。 txtA ~ txtC を UserControl コンテナに入れて UserControl に一任すると面白いかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
chelsea
常連さん
会議室デビュー日: 2007/12/19
投稿数: 48
投稿日時: 2008-07-03 18:14
みなさんありがとうございます。返信させていただきます。

引用:

ueさんの書き込み
これを実現するためには TextBoxA(txtA)と TextBoxB(txtB)とに KeyUp イベントなりで TextBox1(txt1)に Control.Focus する処理を書く必要があります。


コード:
    Private Sub txtA_KeyUp(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtA.KeyUp
        If e.KeyValue = Keys.Tab Then
            txt1.Select()
        End If
    End Sub


最初上記のコードで行っていたのですが、txt1からtabキーを押したときに
txtAにフォーカスが移って、すぐtxt1にフォーカスが移ってしまいました。
多分もうひとつなにか記述すればよいとは思うのですが...


引用:

rainさんの書き込み
ところで、以下の場合はどういう順序で移動するのでしょうか?
・txt1から、Shift+Tabキーで逆順に辿る
・TabIndexが最も大きいコントロールから、Tabキーでさらに移動する


txt1から、Shift+Tabキーで逆順に辿る場合は、txtAにフォーカスが移ればよいです。
顧客いわくtxtBはマウスで直接移ればよいらしいので。

TabIndexが最も大きいコントロールから、Tabキーでさらに移動する場合は、単純に一番小さいコントロールに移ればよいです。
(コントロールが5つあって、TabIndexが5のコントロールから1のコントロールに移る、といった感じです。)


引用:

nakaPさんの書き込み
もしくはEnterイベントでお互いのTabStopプロパティを操作するとか。


コード:
    Private Sub txtB_Enter(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles txtB.Enter
        Me.txtB.TabStop = False
    End Sub


最終的にはこちらにしました。上でも書きましたが、txtBにはTabではなくマウスで移ればよいらしいので。


引用:

じゃんぬねっとさんの書き込み
TabIndex で制御するのは保守性に欠けるので、ProcessTabKey メソッドでもオーバーライドして制御した方がマシかなぁと思います。 txtA ~ txtC を UserControl コンテナに入れて UserControl に一任すると面白いかもしれません。


今回は実装していませんが(理解できてないというのもありますがw)このことについてはまた自分で調べてみます。



みなさん助言ありがとうございました。
koj
会議室デビュー日: 2003/06/23
投稿数: 5
投稿日時: 2008-07-03 19:42
こんにちは。

もう解決した雰囲気に口を挟むのもなんですが、chelseaさんのおっしゃる仕様であればTab順を txtA txtB txt1 にして、txtBのTabStopプロパティをFalseにすればOKじゃないですか?
1

スキルアップ/キャリアアップ(JOB@IT)