none
コントロールの参照の仕方について RRS feed

  • 質問

  • form1にlabelを動的に増やす仕組みが組み込まれています。(ボタンクリックで増えていく)

    ラベルのnameは label乱数 という感じで設定しています。

    任意のlabelのtextを変更できるようにしようと考えていて、

    ラベルの右クリック→contextmenustrip表示→

    プロパティ クリック→ form2開く

    form2でlabelのtextを変更できるようにしようと考えています。

    form2の中で

    form1.    label乱数   .text = (新しく設定したいテキスト) もしくは

    form1.   ContextMenuStrip1.SourceControl.Name  .text  = (新しく設定したいテキスト)

    みたいに、プログラムを書くとエラーが起きます。コードを書いてる段階でそのようなラベルが存在しないからです。

    伝えるのが下手で申し訳ありません。状況は伝わったでしょうか><

    解決方法を教えていただけたら幸いです。調べ方もよくわからなかったです。。。。

    2011年9月16日 18:14

回答

  • Form2に変更対象のラベルを伝えてやればいいと思いますが。

    Public Class Form1
    
        Private Sub プロパティToolStripMenuItem_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles プロパティToolStripMenuItem.Click
    
            Dim frm2 As New Form2
            'From2で書き換えたいLabelをセットする
            frm2.TargetControl = ContextMenuStrip1.SourceControl
            frm2.ShowDialog()
        End Sub
    End Class
    
    Public Class Form1
    
        Private Sub プロパティToolStripMenuItem_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles プロパティToolStripMenuItem.Click
    
            Dim frm2 As New Form2
            'From2で書き換えたいLabelをセットする
            frm2.TargetControl = ContextMenuStrip1.SourceControl
            frm2.ShowDialog()
        End Sub
    End Class
    
    
    
    Public Class Form2
    
        Public Property TargetControl() As Control
            Get
                Return _TargetControl
            End Get
            Set(ByVal value As Control)
                _TargetControl = value
                If (value IsNot Nothing) Then
                    TextBox1.Text = value.Text
                End If
            End Set
        End Property
        Private _TargetControl As Control
    
        Private Sub TextBox1_TextChanged _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles TextBox1.TextChanged
            If (TargetControl IsNot Nothing) Then
                TargetControl.Text = TextBox1.Text
            End If
        End Sub
    End Class</pre>
    <br /><br />



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 編集済み gekkaMVP 2011年9月16日 22:22
    • 回答としてマーク mo12mo34 2011年9月17日 8:18
    2011年9月16日 22:17

すべての返信

  • 外池と申します。仰ること、わかります(笑) 大丈夫ですよ。

    実現されたいことを、大まかに言えば、ご自身のプログラムで動的にLabelコントロールを作成し、Form上に配置し、任意のLabelコントロールのTextプロパティーに書き込みを行いたい、というものですよね?

    解決策は、プログラムに、動的に作成したLabelコントロールの一覧を格納する「配列の類」を新たに設けることです。

    どんな「名前」で管理したいかによりますが、単純に、番号で管理してよければ、Labelコントロールの配列そのものでもいいですしジェネリックのList(Of T)とか。独自の名前、ご質問にあるような「乱数」を使いたければ、その名前で検索できるジェネリックのDictionati(Of T)とか。


    (ホームページを再開しました)
    2011年9月16日 22:08
  • Form2に変更対象のラベルを伝えてやればいいと思いますが。

    Public Class Form1
    
        Private Sub プロパティToolStripMenuItem_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles プロパティToolStripMenuItem.Click
    
            Dim frm2 As New Form2
            'From2で書き換えたいLabelをセットする
            frm2.TargetControl = ContextMenuStrip1.SourceControl
            frm2.ShowDialog()
        End Sub
    End Class
    
    Public Class Form1
    
        Private Sub プロパティToolStripMenuItem_Click _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles プロパティToolStripMenuItem.Click
    
            Dim frm2 As New Form2
            'From2で書き換えたいLabelをセットする
            frm2.TargetControl = ContextMenuStrip1.SourceControl
            frm2.ShowDialog()
        End Sub
    End Class
    
    
    
    Public Class Form2
    
        Public Property TargetControl() As Control
            Get
                Return _TargetControl
            End Get
            Set(ByVal value As Control)
                _TargetControl = value
                If (value IsNot Nothing) Then
                    TextBox1.Text = value.Text
                End If
            End Set
        End Property
        Private _TargetControl As Control
    
        Private Sub TextBox1_TextChanged _
            (ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles TextBox1.TextChanged
            If (TargetControl IsNot Nothing) Then
                TargetControl.Text = TextBox1.Text
            End If
        End Sub
    End Class</pre>
    <br /><br />



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 編集済み gekkaMVP 2011年9月16日 22:22
    • 回答としてマーク mo12mo34 2011年9月17日 8:18
    2011年9月16日 22:17
  • 外池さんgekkaさん

    迅速かつ丁寧な回答ありがとうございます。

    無事解決し、propertyについても勉強することができました!!!!(^^♪

    やりたいことが伝わってよかったです!!!

     

    2011年9月17日 7:14