如何动态地在表单中添加自定义控件

时间:2017-11-25 04:31:35

标签: c# winforms

我有一个程序,其中我动态添加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);

其他代码是设置控制位置,宽度,高度等等。

我的问题是我有一个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()
    {

    }
 }
}

2 个答案:

答案 0 :(得分:3)

以下是如何从程序集中获取类型。想象一下,在名为SomeNamespace.SomeClass的dll中有一个全名(类名+名称空间)Some.dll的类:

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

所以在你的情况下它将是:

Type type = Type.GetType("CustomCtrl.CButton, 
    DllWhereCButtonIs"); // without .dll

答案 1 :(得分:1)

Type.GetType("namespace.Type")仅在mscorlib.dll或当前正在执行的程序集中存在类型时才有效。如果不是这些,则应使用system.type.assemblyqualifiedname

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