朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら 
.Net フォームでコントロールの名前でコントロールのインスタンスに動的にアクセスする





デリゲートを共通で使いたいときなどに、senderのインスタンスにアクセスしたい時に次のような感じで、コンテナのControlsプロパティにNameを渡すことで、アクセス可能になります。
もちろんアクセスしたいコントロールのインスタンスは、キチンとした型にキャストしないと駄目です。
なので、デリゲート側でどの型のインスタンスにアクセスするか決めておかないとキャストが出来ないので駄目です。


サンプルコードは、フォームの直下にbutton1、button2、button3があり、panel1の中にbutton4、button5、button6を 置いた状態で行っています。

C#

    namespace Project_ControlsKey
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton1コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton1コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
            private void button2_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton2コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton2コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
            private void button3_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton3コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton3コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
            private void button4_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton4コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton4コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
            private void button5_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton5コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton5コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
            private void button6_Click(object sender, EventArgs e)
            {
                //Formの直下にbutton6コントロールがあるか確認
                bool blnRoot = this.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnRoot.ToString() + " in root.");
                //panel1の直下にbutton6コントロールがあるか確認
                bool blnPanel = this.panel1.Controls[(sender as Button).Name] == null ? false : true;
                MessageBox.Show(blnPanel.ToString() + " in panel1.");
            }
        }
    }
    

VB.NET

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Formの直下にbutton1コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton1コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            'Formの直下にbutton2コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton2コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            'Formの直下にbutton3コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton3コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            'Formの直下にbutton4コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton4コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            'Formの直下にbutton5コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton5コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
        Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
            'Formの直下にbutton6コントロールがあるか確認
            Dim blnRoot As Boolean = If(Me.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnRoot.ToString() & " in root.")
            'panel1の直下にbutton6コントロールがあるか確認
            Dim blnPanel As Boolean = If(Me.Panel1.Controls.Item((CType(sender, Button).Name)) Is Nothing, False, True)
            MessageBox.Show(blnPanel.ToString() & " in panel1.")
        End Sub
    End Class
    








良いやや良い普通やや悪い悪い

投稿日時評価コメント