2017-11-25 13 views
1

私はcontrolsを動的に追加するプログラムを持っています。制御タイプはdatabaseの値に基づいています。たとえば、Databaseの値がLabelの場合、プログラムは動的にコントロールを作成します。フォームにカスタムコントロールを動的に追加する方法

コントロールを動的に作成することは効果的です。私は、関数の下に使用しています。その後、

Type typeFrm = typeof(Form); 
Assembly assb = typeFrm.Assembly; 
Type controlType = assb.GetType("System.Windows.Forms." + strType); 
object obj = Activator.CreateInstance(controlType); 
Control control = (Control)obj; 
return control; 

Control ctrl = CreateControl(strCtrlType);

その他のコードを設定するコントロールの位置、幅、高さなどのectれます。

私の質問はcustom controlです。どのようにフォームに動的に追加されますか?私は上記の機能を試してみましたが、行変更:

Type controlType = assb.GetType("System.Windows.Forms." + strType);

Type controlType = assb.GetType("CustomCtrl." + strType);

しかし、その動作していない

にします。関数は常に nullを返します。

サンプルカスタムコントロールコードを参照してください。

namespace CustomCtrl 
{ 
public class CButton : Button 
{   
    public CButton() : base() 
    { 

    } 
} 
} 

答えて

1

Type.GetType("namespace.Type")だけでなく、それらのものの種類ががmscorlib.dllで存在する場合に動作しますか、現在実行assembly.Ifが真である、あなたはsystem.type.assemblyqualifiedname

https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx

+0

私は 'タイプcontrolType = assbをしようとすると.GetType( "CustomCtrl。" + strType).AssemblyQualifiedName; 'は文字列をSystem.Typeに変換できません。 – Zhyke

+2

@Zhyke - Type.GetType( "namespace.Type、assembly.dll、Version = 0.0.0.0、Culture = neutral、PublicKeyToken = null") 'を使用する必要があります。タイプ ")。AssemblyQualifiedName'。後者は明らかに機能しません。 – Enigmativity

3

を使用する必要がありますアセンブリから型を取得する方法は次のとおりです。あなたはSome.dllという名前のDLL内の完全な名前(クラス名+名前空間)SomeNamespace.SomeClassを持つクラスを持っている想像:

Type type = Type.GetType("SomeNamespace.SomeClass, 
    Some"); // without .dll 

だからあなたの場合には、それは次のようになります。

Type type = Type.GetType("CustomCtrl.CButton, 
    DllWhereCButtonIs"); // without .dll 
関連する問題