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

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

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

ユーザコントロール間のフォーカス移動時の制御

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

■87251 / inTopicNo.1)  ユーザコントロール間のフォーカス移動時の制御
  
□投稿者/ 青霧島 (1回)-(2018/05/01(Tue) 18:09:02)

分類:[.NET 全般] 

お世話になります。
ユーザコントロール間のフォーカス移動時の制御についての質問させてください。

プログラム言語はC#.Netで、開発環境はVisual Studio 2015です。


水平方向にTextBoxやRadioButton、CheckBoxなどを1列に並べて配置したユーザコントロールを作成しました。
タブオーダーは左から右へ流れるように設定しています。
そして、このユーザコントロールを垂直方向へ十数個並べて配置しました。
よって、現状では左から右へのフォーカス移動を繰り返しながら最下段の
ユーザコントロールへ移動していきます。ちなみにTabキーでもフォーカス移動可能です。

しかし、アプリケーションの利用者より、TextBoxだけ垂直方向へ一気にキーボードで入力し、
RadioButtonやCheckBoxを後からマウスで入力したいという要望が出ました。
同様な構成の画面が複数あるので、対応を検討しています。

ただ、これを実現しようとすると、ユーザコントロール間を行き来する度に
遷移先・遷移元によってフォーカス位置を変えていくような
非常に複雑なフォーカス制御が必要となりそうなので、苦慮しております。

最悪は、これら全てを1つのユーザコントロールにしてしまうしか無さそうですが、
何か画期的な方法などありましたらご教示ください。
引用返信 編集キー/
■87252 / inTopicNo.2)  Re[1]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ Hongliang (637回)-(2018/05/01(Tue) 18:15:18)
そのUseControlにIsEditModeみたいなプロパティを用意し、trueにした時はTextBox以外のEnabledをfalseにしてしまう、みたいなのはどうでしょうか。
引用返信 編集キー/
■87253 / inTopicNo.3)  Re[1]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ WebSurfer (1479回)-(2018/05/01(Tue) 18:29:43)
No87251 (青霧島 さん) に返信
> お世話になります。
> ユーザコントロール間のフォーカス移動時の制御についての質問させてください。
>
> プログラム言語はC#.Netで、開発環境はVisual Studio 2015です。

何を作っているのでしょう? Windows Forms?

ちなみに、ASP.NET Web Forms にもユーザーコントロール, TextBox, RadioButton, CheckBox
というものはありますが・・・

フォーカスの移動というのも当てはまります。(ブラウザ上での話ですが)

Web アプリではないだろうなぁと思いながらも聞いてます。

引用返信 編集キー/
■87256 / inTopicNo.4)  Re[2]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ Jitta (371回)-(2018/05/01(Tue) 20:39:35)
No87252 (Hongliang さん) に返信
> そのUseControlにIsEditModeみたいなプロパティを用意し、trueにした時はTextBox以外のEnabledをfalseにしてしまう、みたいなのはどうでしょうか。

あるいは、TabStop
引用返信 編集キー/
■87261 / inTopicNo.5)  Re[1]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ shu (1109回)-(2018/05/02(Wed) 07:38:45)
No87251 (青霧島 さん) に返信

引用返信 編集キー/
■87262 / inTopicNo.6)  Re[1]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ shu (1110回)-(2018/05/02(Wed) 07:48:15)
No87251 (青霧島 さん) に返信

空で誤返信してしまいました。

−−−−

(1)ユーザーコントロール内のすべてのコントロールにおいてTabStopをFalseにします。
(2)TextBoxへフォーカス移動したらイベントなどを利用してフォーム側で全てのユーザー
コントロールの同じTextBoxにTabStopをTrue設定します。ここですでにTabStopを設定してある
TextBoxがあったらそれはTabStopをFalseに設定します。
(3)フォーム内のコントロールへフォーカス移動したらユーザーコントロールの最初のTextBoxに対して
TabStopをTrueにする処理を行います。

(3)のタイミングは(2)より先に行う必要もあるかもしれません。

こんな感じでどうでしょう?

引用返信 編集キー/
■87264 / inTopicNo.7)  Re[2]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ shu (1111回)-(2018/05/02(Wed) 10:36:00)
No87262 (shu さん) に返信

サンプルです。(VB.NETです)
ラジオボタンはフォーカス取得するとTabStopがTrueになったりするので
leave時にTabStopをfalseに設定した方がよさそうです。

Form1
-----
Public Class Form1
    Implements IUserControl1

    Private rows() As UserControl1
    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        rows = {UserControl11, UserControl12, UserControl13, UserControl14, UserControl15, UserControl16}
    End Sub

    Public Sub FocusedTextBox(No As Integer) Implements IUserControl1.FocusedTextBox
        For Each row In rows
            row.SetActiveText(No)
        Next
    End Sub
End Class
-----

UserControl1
-----
Public Class UserControl1

    Private _Texts() As TextBox

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        _Texts = {TextBox1, TextBox2, TextBox3}
        For Each txt In _Texts
            AddHandler txt.Enter, AddressOf TextBox_Enter
        Next
    End Sub

    Public Sub SetActiveText(No As Integer)
        For idx = 0 To _Texts.Length - 1
            If idx = No Then
                _Texts(idx).TabStop = True
            Else
                _Texts(idx).TabStop = False
            End If
        Next
    End Sub

    Private Sub TextBox_Enter(sender As Object, e As EventArgs)
        Dim txt = DirectCast(sender, TextBox)
        If txt.TabStop Then Exit Sub
        Dim idx = Array.IndexOf(_Texts, sender)
        DirectCast(Me.ParentForm, IUserControl1).FocusedTextBox(idx)
    End Sub

    Private Sub RadioButton1_Leave(sender As Object, e As EventArgs) Handles RadioButton1.Leave
        RadioButton1.TabStop = False
    End Sub
End Class

Public Interface IUserControl1
    Sub FocusedTextBox(No As Integer)
End Interface
-----

引用返信 編集キー/
■87265 / inTopicNo.8)  Re[2]: ユーザコントロール間のフォーカス移動時の制御
□投稿者/ 青霧島 (2回)-(2018/05/02(Wed) 10:39:26)
No87253 (WebSurfer さん) に返信

 記載不足で申し訳ありません。
 Windows Formsのアプリケーションです。


No87252 (Hongliang さん) に返信
No87256 (Jitta さん) に返信
No87262 (shu さん) に返信

 なるほど〜。
 Tab移動が前提であることに気を取られて、TabStopそのものをTrue/Falseで
 制御してしまうという方法は思い付きませんでした。
 これであれば特定のコントロールのTabStopを制御することで
 任意の位置へフォーカス移動させることが出来そうです。

 この方針で改修を行ってみます。
 ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ