C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: パネルに配置されたテキストボックスのタブ移動


(過去ログ 19 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■7696 / inTopicNo.1)  パネルに配置されたテキストボックスのタブ移動
  
□投稿者/ のの (1回)-(2007/09/13(Thu) 09:53:56)

分類:[VB.NET/VB2005] 

使用言語:VB.NET

Form1にPanel1とPanel2を配置し、
Panel1には、TextBox1(TabIndex=0)、TextBox3(TabIndex=2)を配置し、
Panel2には、TextBox2(TabIndex=1)、TextBox4(TabIndex=3)を配置した場合、
TABキーを押下したときののフォーカスの移動が、

TextBox1→TextBox3→TextBox2→TextBox4

となってしまいます。これをTabIndex通りに

TextBox1→TextBox2→TextBox3→TextBox4

とするには、どのようにすればよいでしょうか?


引用返信 編集キー/
■7705 / inTopicNo.2)  Re[1]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ 魔界の仮面弁士 (422回)-(2007/09/13(Thu) 12:35:11)
No7696 (のの さん) に返信
> Form1にPanel1とPanel2を配置し、
> Panel1には、TextBox1(TabIndex=0)、TextBox3(TabIndex=2)を配置し、
> Panel2には、TextBox2(TabIndex=1)、TextBox4(TabIndex=3)を配置した場合、

Panel にも TabIndex がありますよね。
http://bbs.wankuma.com/index.cgi?mode=one&namber=7698&type=7689&space=105&KLOG=7

ですから、Panel1.TabIndex = 0、Panel2.TabIndex = 1 だった場合、
 TextBox1 (Panel1.TabIndex = 0 内の TextBox1.TabIndex = 0)
 TextBox3 (Panel1.TabIndex = 0 内の TextBox3.TabIndex = 2)
 TextBox2 (Panel2.TabIndex = 1 内の TextBox3.TabIndex = 1)
 TextBox4 (Panel2.TabIndex = 1 内の TextBox3.TabIndex = 3)
という順番でタブ順が決定されます。


> これをTabIndex通りに
> TextBox1→TextBox2→TextBox3→TextBox4
> とするには、どのようにすればよいでしょうか?

TextBox を、Panel の上に配置しなければ良いかと。

すなわち、それらのTextBox を、すべて Form の上に配置しておき、その座標(Location)を調整して、
Panel の上に(載せるのではなく)重ねるようにしておくという事です。
引用返信 編集キー/
■7730 / inTopicNo.3)  Re[2]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ のの (2回)-(2007/09/13(Thu) 19:25:29)
No7705 (魔界の仮面弁士 さん) に返信

返信ありがとうございます。

> TextBox を、Panel の上に配置しなければ良いかと。
>
> すなわち、それらのTextBox を、すべて Form の上に配置しておき、その座標(Location)を調整して、
> Panel の上に(載せるのではなく)重ねるようにしておくという事です。

実は、Panelの上にTextBoxを複数配置したのは、Splitterを利用して、
Panel上のそれぞれのTextBoxの幅を同時にコントロールしたいのです。

つまり、Form1にPanel1(Dock=Left)、Splitter1(Dock=Left)、Panel2(Dock=Fill)を配置し、
Panel1にTextBox1(Anchor=Top, Left, Right)、TextBox3(Anchor=Top, Left, Right)を
Panel2にTextBox2(Anchor=Top, Left, Right)、TextBox4(Anchor=Top, Left, Right)を
設定したいのです。

このようにしたい場合、上記の方法だとPanelの上にTextBoxを重ねることで
TabIndex通りにフォーカスを移動させることは可能ですが、PanelにAnchorを
設定することは、可能なのでしょうか?

是非、ご回答を宜しくお願いいたします。
引用返信 編集キー/
■7736 / inTopicNo.4)  Re[3]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ まどか (370回)-(2007/09/13(Thu) 20:28:53)
とにかく異なるコンテナにそれぞれがある状態では無理です。

ひとつのPanel(コンテナであればなんでもよい)の中にTextBoxとSplitterを配置すればできるかも。
引用返信 編集キー/
■7738 / inTopicNo.5)  Re[4]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ のの (3回)-(2007/09/13(Thu) 21:13:12)
No7736 (まどか さん) に返信

返信ありがとうございます。

> とにかく異なるコンテナにそれぞれがある状態では無理です。
>
> ひとつのPanel(コンテナであればなんでもよい)の中にTextBoxとSplitterを配置すればできるかも。

む〜、そうですか。わかりました。
別の方法を考えたほうが良さそうですね。

ありがとうございました。
解決済み
引用返信 編集キー/
■7741 / inTopicNo.6)  Re[4]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ 魔界の仮面弁士 (423回)-(2007/09/13(Thu) 22:47:14)
No7736 (まどか さん) に返信
> とにかく異なるコンテナにそれぞれがある状態では無理です。

コンテナを跨ぐのであれば、多少面倒ですが、各 TextBox の「後」に
フォーカス制御用として Control0 = New Control() なオブジェクトを貼っておき、

[Form1]
┣[Panel1]
┃┣[TextBox1] TabIndex=0
┃┣[Control0] TabIndex=1 …… Enter イベントで TextBox2.Select()
┃┣[TextBox3] TabIndex=2
::  

となるようにしてやれば、別コンテナのコントロールにも Tab キーで移動できるようになります。
もし、Shift + Tab にも対応させるなら、TextBox の「前」の TabIndex にも配置すれば OK 。


より汎用的にするなら、「TextBox2.Select()」のように固定的に書くのではなく、
「次の/前の TabIndex 値を持った、フォーカス可能なコントロール」を探して、
そこにフォーカスを移動させるようなコードにするとか。
引用返信 編集キー/
■7745 / inTopicNo.7)  Re[5]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ のの (4回)-(2007/09/14(Fri) 08:45:04)
返信ありがとうございます。

No7741 (魔界の仮面弁士 さん) に返信
> ■No7736 (まどか さん) に返信
>>とにかく異なるコンテナにそれぞれがある状態では無理です。
>
> コンテナを跨ぐのであれば、多少面倒ですが、各 TextBox の「後」に
> フォーカス制御用として Control0 = New Control() なオブジェクトを貼っておき、
>
> [Form1]
> ┣[Panel1]
> ┃┣[TextBox1] TabIndex=0
> ┃┣[Control0] TabIndex=1 …… Enter イベントで TextBox2.Select()
> ┃┣[TextBox3] TabIndex=2
> ::  
>
> となるようにしてやれば、別コンテナのコントロールにも Tab キーで移動できるようになります。
> もし、Shift + Tab にも対応させるなら、TextBox の「前」の TabIndex にも配置すれば OK 。
>
>
> より汎用的にするなら、「TextBox2.Select()」のように固定的に書くのではなく、
> 「次の/前の TabIndex 値を持った、フォーカス可能なコントロール」を探して、
> そこにフォーカスを移動させるようなコードにするとか。

これなら、出来そうですね。
参考にさせていただきます。

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

引用返信 編集キー/
■7748 / inTopicNo.8)  Re[1]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ @echo (1回)-(2007/09/14(Fri) 09:56:34)
2007/09/14(Fri) 10:07:29 編集(投稿者)
No7696 (のの さん) に返信
> TextBox1→TextBox2→TextBox3→TextBox4
> 
> とするには、どのようにすればよいでしょうか?

TAB や矢印キーなどのダイアログキーは ProcessDialogKey メソッドで
処理するのが一般的かと思います。

C# ですが...

private List<Control> f_TabList = new List<Control>();

private void 初期化()
{
  f_TabList.AddRange(new Control[]{
    textBox1, textBox2, textBox3, textBox4
  });
}
protected override bool ProcessDialogKey (Keys keyData)
{
  if (keyData == Keys.Tab || keyData == (Keys.Shift | Keys.Tab))
  {
    int idx = f_TabList.IndexOf(ActiveControl);
    if (idx >= 0)
    {
      idx = idx + ((keyData & Keys.Shift) == 0 ? 1 : -1);
      if (idx >= 0 && idx < f_TabList.Count)
      {
        f_TabList[idx].Focus();
        return true;
      }
    }
  }
  return base.ProcessDialogKey(keyData);
}

引用返信 編集キー/
■7770 / inTopicNo.9)  Re[2]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ のの (5回)-(2007/09/14(Fri) 16:16:31)
返信ありがとうございます。

> TAB や矢印キーなどのダイアログキーは ProcessDialogKey メソッドで
> 処理するのが一般的かと思います。

ProcessDialogKey メソッドというものがあるとは、気付きませんでした。

教えていただいたソースコードを参考にVB.NETで試してみたところ
思った通りの動作を実現できました。

大変、ありがとうございました。
引用返信 編集キー/
■8236 / inTopicNo.10)  Re[2]: パネルに配置されたテキストボックスのタブ移動
□投稿者/ くれない (1回)-(2007/09/26(Wed) 16:43:25)
VB.NETで使用不可コントロールは選択しない処理を加えてみた

Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
Dim idx As Integer

If keyData = Keys.Tab Or keyData = (Keys.Shift Or Keys.Tab) Then
idx = f_TabList.IndexOf(ActiveControl)
If idx >= 0 Then

Do
idx = idx + (IIf(keyData = (Keys.Shift Or Keys.Tab), -1, 1))
If idx <= -1 Then
idx = f_TabList.Count - 1
ElseIf idx >= f_TabList.Count Then
idx = 0
End If

If f_TabList(idx).Visible = True And f_TabList(idx).Enabled = True And f_TabList(idx).TabStop = True Then
f_TabList(idx).Focus()
Return True
End If
Loop

End If
End If

Return MyBase.ProcessDialogKey(keyData)

End Function
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -