如何在运行时创建变量控件?

时间:2011-03-04 13:21:17

标签: c# .net reflection compact-framework .net-assembly

我正在尝试使用Reflection在运行时创建控件。 在我的例子中,我得到一个像Label或Button的字符串,我想创建一个对象标签或按钮。

Assembly WinFormasm = Assembly.Load("System.Windows.Forms,Version=2.0.000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

Control label = (Control)Activator.CreateInstance(WinFormasm.GetType("System.Windows.Forms."+type));

当我执行此操作时,我收到错误:

  

找不到文件或程序集名称'System.Windows.Forms,Version = 2.0.000.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项。

我真的不知道那里有什么问题。我也尝试过:

try
{
    Type cntrl = Type.GetType("System.Windows.Forms.Button,System.Windows.Forms, Culture=neutral, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089", true);
    label1.Text += cntrl.ToString() + " ";
}
catch(Exception e)
{
    label1.Text += e.ToString() + " ";
}

尝试这个,我遇到了一个执行错误:他无法创建类型并返回null。如果我将gettype字符串更改为System.Int32,则可以正常工作。

如何使用字符串创建控件项?

5 个答案:

答案 0 :(得分:2)

以下是什么问题?

Button cntrl = new Button();

如果您对这些值进行硬编码,为什么需要使用反射?

答案 1 :(得分:1)

您的版本号对于System.Windows.Forms来说是错误的:

var assembly = Assembly.Load("System.Windows.Forms, version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

然后要创建所需的控件类型,只需指定类型名称:

var type = "Button";
var control = (Control)Activator.CreateInstance(assembly.GetType("System.Windows.Forms." + type));

答案 2 :(得分:0)

从字符串
创建控件 你需要使用Activator
检查此link

答案 3 :(得分:0)

http://bytes.com/topic/c-sharp/answers/236152-how-create-control-instance-dynamicly-text有一个非常有意义的想法,通过对我有用的一点修复来解决问题。

我得到了那种类型的形式(控件以正确的形式站立),我得到了这个类型 从程序集中我通过使用我想要的控件类型的参数调用gettype函数来获取对象 最后我将其转换为控件类型。

private Control createcontrol(string type)
{
    Type typen = typeof(Form);
    Assembly assem = typen.Assembly;
    //Assembly assem = Assembly.LoadFrom(typeof(Form).ToString());
    Type controlType = assem.GetType("System.Windows.Forms."+type); // GetType(controlType);
    object obj = Activator.CreateInstance(controlType);
    Control control = (Control)obj;
    return control;
}

感谢帮助人员!

答案 4 :(得分:0)

        string ControlType = "TextBox";

        Assembly FormAssembly = Assembly.GetAssembly(typeof(Form));
        Control MyControl = (Control)FormAssembly.CreateInstance("System.Windows.Forms." + ControlType);

只需更改ControlType值。