none
フォームのコントロールオブジェクトを取得する方法。 RRS feed

  • 質問

  • 現在、Windowsフォームのアプリケーションを作成しています。

    【質問内容】

    Windowsフォームにコントロールを配置し、そのコントロールを取得するメソッドを作成しているのですが、下記サンプルコードのTypeInfo.GetFieldメソッドでは、コントロールを取得することが出来ません。GetPropertyメソッドでは取得することは確認しているのですが、GetFieldメソッドでは取得することが出来ないのは何故でしょうか?

    【作業手順】

    1.Windowsフォームを作成。

    2.取得するコントロールを配置(コンポーネントレイに配置されないコントロールなら何でもOK)

    3.下記コードを実装。

    【サンプルコード】

    サンプルコードでは、取得するコントロールとしてStatusStripのToolStripStatusLabel1を配置。

    ボタンコントロールも配置して、ボタンクリックイベント時に実装。

    下記サンプルコードはカスタムコントロールに実装することを検討しているため、Reflectionクラスを使用している。

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim TypeInfo As Type = Me.GetType
            Dim InfoSS As Reflection.FieldInfo = TypeInfo.GetField("ToolStripStatusLabel1", _
                                                                    System.Reflection.BindingFlags.NonPublic Or _
                                                                    System.Reflection.BindingFlags.Instance)
            If InfoSS IsNot Nothing Then
                Dim TSSLabel As ToolStripStatusLabel = DirectCast(InfoSS.GetValue(Me), ToolStripStatusLabel)
                If TSSLabel IsNot Nothing Then
                    MessageBox.Show("取得成功!")
                Else
                    MessageBox.Show("取得失敗")
                End If
            End If

        End Sub

    2006年7月11日 12:29

回答

  • インスタンス名が違うからだと思います

    VS2005が自動生成したオブジェクトは インスタンス名の前に『_』が付くようです

    フィールドとして
    Private mStr2 as String = "456"
    を追加して

    Private Sub Button1_Click()
      dim typeInfo as Type = me.GetType
      dim infoSS() as FieldInfo
      infoSS = typeINfo.GetFields( _
        Reflection.BindingFlags.NonPublic Or _
        Reflection.BindingFlags.Instance)
      for each oItem as Reflection.FieldInfo in infoSS
        Debug.WriteLine( oItem.Name )
      next

    End Sub
    といった具合で確認してみましょう

    出力ウィンドウに『_ToolStripStatusLabel1』などと表示されると思いますよ

    2006年7月11日 20:40

すべての返信

  • インスタンス名が違うからだと思います

    VS2005が自動生成したオブジェクトは インスタンス名の前に『_』が付くようです

    フィールドとして
    Private mStr2 as String = "456"
    を追加して

    Private Sub Button1_Click()
      dim typeInfo as Type = me.GetType
      dim infoSS() as FieldInfo
      infoSS = typeINfo.GetFields( _
        Reflection.BindingFlags.NonPublic Or _
        Reflection.BindingFlags.Instance)
      for each oItem as Reflection.FieldInfo in infoSS
        Debug.WriteLine( oItem.Name )
      next

    End Sub
    といった具合で確認してみましょう

    出力ウィンドウに『_ToolStripStatusLabel1』などと表示されると思いますよ

    2006年7月11日 20:40
  • redfox63さん、まどかさん返信ありがとうございます。

    redfox63さんのサンプルコードで確認しました。

    Designerファイルには「Friend WithEvents Button1 As System.Windows.Forms.Button」などと自動生成されているため、『_』が付いているなんて気付きませんでした。

    仕様なら仕方ないですね。

    本当にありがとうございました。

    2006年7月14日 3:11