我有一个程序,其中我动态添加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()
{
}
}
}
答案 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