.NET TIPS

コントロールのクラス名からコントロール・オブジェクトを作成するには?

デジタルアドバンテージ
2004/06/25

 Windowsアプリケーションにおいて、テキストボックスやラベルなどコントロール・オブジェクトを、そのクラス名となる文字列を指定して作成することができる。例えばテキストボックスに対応したクラスはTextBoxクラス(System.Windows.Forms名前空間)であるが、このクラスをnewキーワードによりインスタンス化するのではなく、「System.Windows.Forms.TextBox」という文字列を指定してオブジェクトを作ることができる。

 これにはまず、コントロールを示すクラスと同じアセンブリに含まれる別のクラス(ここではControlクラスを用いる)を利用して、そのアセンブリ(Assemblyオブジェクト)を取得する。このためのコードは次のようになる。

Assembly a = typeof(Control).Assembly;

 次に、いま得られたAssemblyオブジェクトのCreateInstanceメソッドにより、そのアセンブリに含まれるクラスのインスタンスを作成する。このときメソッドのパラメータには、作成するインスタンスのクラス名を文字列として指定できる。指定するクラス名は、その名前空間を含んだフルネームでなければならない。

string ctrlName = "System.Windows.Forms.TextBox";
Control ctrl = (Control)a.CreateInstance(ctrlName);

 このコードでは、作成したオブジェクトを各コントロールに共通な親クラスであるControlクラスにキャストしている(ここでTextBoxクラスなどにキャストしては、文字列でクラス名を指定する意味がない)。

 以上のような方法を利用して作ったコントロールを持つWindowsアプリケーションのサンプル・プログラムを次に示す。

// createctrl.cs

using System;
using System.Reflection;
using System.Drawing;
using System.Windows.Forms;

class CreateControl {
  static void Main() {
    string ctrlName = "System.Windows.Forms.TextBox";

    Assembly a = typeof(Control).Assembly;
    Control ctrl = (Control)a.CreateInstance(ctrlName);

    ctrl.Text = ctrlName;
    ctrl.Location = new Point(30, 30);
    ctrl.Width = 200;

    Form myform = new Form();
    myform.Controls.Add(ctrl);

    Application.Run(myform);
  }
}

// コンパイル方法:csc createctrl.cs
コントロールのクラス名からコントロールを作成するC#のサンプル・プログラム(createctrl.cs)
 
' createctrl.vb

Imports System
Imports System.Reflection
Imports System.Drawing
Imports System.Windows.Forms

Class CreateControl
  Shared Sub Main()
    Dim ctrlName As String = "System.Windows.Forms.TextBox"

    Dim a As [Assembly] = GetType(Control).Assembly
    Dim ctrl As Control = CType(a.CreateInstance(ctrlName), Control)

    ctrl.Text = ctrlName
    ctrl.Location = new Point(30, 30)
    ctrl.Width = 200

    Dim myform As Form = new Form()
    myform.Controls.Add(ctrl)

    Application.Run(myform)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll createctrl.vb
コントロールのクラス名からコントロールを作成するVB.NETのサンプル・プログラム(createctrl.vb)

 このサンプル・プログラムの実行画面は次のようになる。

サンプル・プログラムの実行画面
テキストボックス・コントロールでは、Textプロパティにセットした値は、コントロール内に表示される文字列となる。

 本稿の方法では、リフレクションによるメソッドやプロパティの操作を行わずに、作成したオブジェクトをControlクラスへキャストし、Controlクラスにあるメソッドやプロパティでコントロールの操作を行う。このため、コントロールに対して可能な操作はその範囲に限られる。End of Article

カテゴリ:Windowsフォーム 処理対象:コントロール
使用ライブラリ:Assemblyクラス(System.Reflection名前空間)
使用ライブラリ:Controlクラス(System.Windows.Forms名前空間)
 
この記事と関連性の高い別の.NET TIPS
文字列で指定したクラスのインスタンスを作成するには?
クラス名指定のインスタンス作成時にコンストラクタへ引数を渡すには?
WebRequest/WebResponseクラスでWebページを取得するには?
実行ファイルのパスを取得するには?
Windowsフォームで簡単に画像を表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間