VB2008名前代入でのフォーカス移動

解決


トシ  2008-04-02 19:40:28  No: 144572  IP: 192.*.*.*

お世話になります。
VB2008でプログラムを開発しています、
戸惑ってしまい教えて頂きたく投稿しました。
-------------------パターン1-------------------------------
Dim name As String = "TextBox1"
Dim control As TextBox = TryCast(Me.Controls(name), TextBox)
If Not control Is Nothing Then control.Text = "ABC"
-------------------パターン2-------------------------------
Dim name As String = "TextBox1"
Dim control As TextBox = TryCast(Me.Controls(name), TextBox)
If Not control Is Nothing Then control.Focus()
------------------------------------------------------------
パターン1ではテキストボックスにデータをセットできるのですが、
同じ要領で動くと思いパターン2を作ってみました、でもフォーカス
が移りません、いろいろ調べましたが解決できません、よい方法が
ありましたら教えて下さい、よろしくお願いします。

編集 削除
シャノン  2008-04-03 10:03:22  No: 144573  IP: 192.*.*.*

名前によるアクセスではなく、直接 TextBox1.Focus() でフォーカスすることは可能なのですか?

編集 削除
トシ  2008-04-03 11:03:49  No: 144574  IP: 192.*.*.*

すいません説明が不十分でした、FormにTextBox1(タブオーダー2)とTextBox2
(タブオーダー1)を貼り付けています、現象はForm_Load時に起きます。
ボタンを追加し、以下のコードにて確認したところ正常に動きました。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim name As String = "TextBox1"
        Dim control As TextBox = TryCast(Me.Controls(name), TextBox)
        If Not control Is Nothing Then control.Focus()
    End Sub

原因は名前代入によるアクセスでなく、Form_Loadにあったようです。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TextBox1.Focus()  'フォーカス移動しない
    End Sub

指定のコントロールにForm_Load時、フォーカスを移動するにはどう
したらよいのでしょうか?

編集 削除
魔界の仮面弁士  2008-04-03 11:39:05  No: 144575  IP: 192.*.*.*

> 指定のコントロールにForm_Load時、フォーカスを移動するにはどう
> したらよいのでしょうか?

コードでどうにかするのではなく、デザイン時に TextBox1 の TabIndex を
最小番号にしておくのが本来のやり方だと思いますよ。

# Compact Framework の場合は、TabIndex が無いので、
# Controls.Add の順番で制御する事になりますけど。


で、フォーカスはそもそも、そのコントロールが使用可能でなければ
意味を為しません。そのため、コントロール自身あるいは親となる
フォームやコントロールが、非表示または使用不可の状態の場合、
Focus メソッドは機能しません。

つまり、Form が Visible = True の状態になっているなら、Load 中でも
フォーカス遷移させられますが…Load 中に自分を表示させるぐらいなら、
Shown イベントを使うべきでしょう。

もし、どうしても Form の Load で制御しなければならないのであれば、
Me.ActiveControl = TextBox1
という方法もあるにはあります。

編集 削除
トシ  2008-04-03 11:56:55  No: 144576  IP: 192.*.*.*

方法はいろいろあるんですね!!
無事解決しました、ありがとうございます。

編集 削除