質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

653閲覧

【WinFormApp】controlのフォーカスが外れるタイミングで遷移先を制御したい

YanValCyn

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2022/02/15 04:41

編集2022/02/15 05:14

お世話になります。
色々調べてみたのですが、どうしても分からなかったため、質問させて頂きます。
お知恵をお貸し頂ければ幸いです。どうぞ宜しくお願いします。

環境

Windows デスクトップアプリケーション
vs2013

実現したいこと

例えば、以下のようなフォームデザインを考えます。

イメージ説明

コード入力後、(DBに該当するコードがあれば)担当者名を呼び出し、部署欄に移動する、といった流れを想定しています。
イメージ説明

今回、追加で実装したいのは、「DBに該当するコードがない場合、担当者名をフリー入力できるようにする」です。
イメージ説明

これにあたり、 担当者コードが入力し終わって、Tabキーなどを使用して別のコントロールに移動するタイミングで、DBに該当するコードがあるかどうかの判定(以下、判定)を行い、

  • コードがあれば、部署欄に移動
  • コードがなければ、担当者名に移動

といった分岐を行いたいです。

試したこと


担当者コードのValidatingイベントで、担当者名のTabStopを切り替えれば遷移先が変化するのではないかと考えたのですが、Validatingイベントに入った時には既に遷移先のコントロールが確定しているようで、うまく行きません。

尚、一度担当者名に遷移した後、「判定」を行い、必要に応じて部署欄に移動するという制御は、担当者名のイベント(Enter、Leave等)が走ってしまうのがマズい場合があるので避けたいと考えています。


上記で試したことを踏まえ、TextChangedイベントで1文字入力される度に「判定」を行い、担当者名のTabStopを切り替えることも考えましたが、負荷もかかるためスマートではないのかな?という気がしています。

最後に

上記「試したこと」の①②以外に何か良い方法があれば伺いたいです。
もしなければ「無いだろう」というご回答もお待ちしております。

teratailで質問することに慣れていないため、何か気になる点などございましたら、ご指摘いただけるとありがたいです。
以上、どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Tab キーまたは Shift + Tab キーを押すと、ContainerControl.ProcessTabKey メソッドが呼ばれます。

「ContainerControl.ProcessTabKey(Boolean) メソッド」
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.containercontrol.processtabkey?view=netframework-4.8

Form の ProcessTabKey メソッドをオーバーライドするといいと思います。

VB

1Protected Overrides Function ProcessTabKey(forward As Boolean) As Boolean 2 If forward Then 3 If 担当者.Focused Then 4 If コードあり Then 5 Return 部署.Focus() 6 Else 7 Return 担当者名.Focus() 8 End If 9 End If 10 End If 11 Return MyBase.ProcessTabKey(forward) 12End Function

SplitContainer 等、CotainerControl を継承したコントロールの上にアクティブなコントロールがあると、そちらの ProcessTabKey が呼ばれます。

継承してカスタムコントロールを作り、ProcessTabKey メソッドは False を返すようにすると、Form の ProcessTabKey で一元管理できます。

投稿2022/02/15 05:49

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YanValCyn

2022/02/15 23:43

ご回答ありがとうございました。 サンプルプログラムを参考にしながら実装し動作しました。 >SplitContainer 等、CotainerControl を継承したコントロールの上にアクティブなコントロールがあると、そちらの ProcessTabKey が呼ばれます。 こちらに留意しながら使わせていただきます。 ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問