在C#中动态创建控件的方法

时间:2010-01-05 22:01:00

标签: c# .net controls runtime

您可以通过哪些方式在C#中动态创建控件?

这首先是对象,但说控件会更准确。我的术语搞砸了。谢谢乔尔。

编辑{ 在运行时创建的控件。并且能够被程序访问和编辑。 这有帮助吗? }

我喜欢动态创作的想法,并想知道有什么方法可以做到这一点。

请每个答案只有一个,我想看看人们如何排名。

例如

private Label _lblCLastName = new Label(); 
private static List<ChildrenPanel> _ListCP = new List<ChildrenPanel>(); 

public void CreatePanel(Panel Container) 
{ 
    // Created Controls
    #region Controls 
    _pnlStudent.Controls.Add(_lblCLastName); 
    //  
    // lblCLastName 
    //  
    _lblCLastName.AutoSize = true; 
    _lblCLastName.Location = new System.Drawing.Point(6, 32); 
    _lblCLastName.Name = "lblCLastName"; 
    _lblCLastName.Size = new System.Drawing.Size(58, 13); 
    _lblCLastName.TabIndex = 10; 
    _lblCLastName.Text = "Last Name"; 

    // Adds controls to selected forms panel 
    Container.Controls.Add(_pnlStudent); 
    // Creates a list of created panels inside the class 
    // So I can access user input 
    ListCP.Add(this); 

} 

这是一个与我所说的很接近的代码片段。我发了另一篇文章,但没有把这个问题写得很对。我将删除它,但它仍然可以查看。

如果仍有问题请建设性我不介意否定输入,只要它有用。

编辑: 我能够得到一些我正在寻找的答案。谢谢所有回复的人。当我能够时,我会关闭它。如果其他人可以关闭它,那将是值得赞赏的。

5 个答案:

答案 0 :(得分:9)

我使用 new 关键字动态创建对象。

答案 1 :(得分:2)

Anonymous Types,C#3.x

这是相当动态的,因为您不必编写类模板来获取自定义对象。

// An anonymous object with two properties: obj.Name and obj.Age
var obj = new { Name = "Joe", Age = 35  };

编译器将根据您提供的初始化值推断属性的类型。

您的源代码无法访问该类型,但可以在IL中看到。但是,如果您创建具有相同属性的多个匿名对象,则C#编译器将对所有这些对象使用相同的类型。

// All objects use the same anonymous type
var obj1 = new { Name = "Joe", Age = 1  };
var obj2 = new { Name = "Art", Age = 30  };
var obj3 = new { Name = "Sally", Age = 25  };

// A different (second) anonymous type
var objDifferent = new { Phone = "555-555-1212", Name = "Joe", Age = 1  };

规定还有更多,但这些很重要。

  • var只能在方法范围(作为局部变量)使用,而不能在类范围内使用。
  • 匿名对象具有只读属性;你无法将数据分配给他们。

答案 2 :(得分:2)

激活(对于远程对象)

使用System.Activator类'重载Activator.CreateInstance方法。这进入了在本地创建对象或远程的领域。

using System;

/* Create instances of a Random number generator (or any class)
 *  without using the 'new' operator.
 */
Random rand1 = Activator.CreateInstance<Random>();
Random rand2 = (Random)Activator.CreateInstance(typeof(Random));
//etc...

MSDN Documentation about Remote Objects.

答案 3 :(得分:2)

动态创建GUI对象非常有用,但是,它也可能是维护的噩梦。

一个好的经验法则是限制动态创建的GUI对象的数量。

实际上想要使用动态创建的GUI对象的一种情况是,当您不知道所需对象的数量或数量时。例如,结果集中每行的一个标签(即使这样,您可以考虑使用DataGrid或GridView类型对象)。

这适用于WinForms和ASP.NET。请务必正确记录您的代码。

我的建议是坚持使用可视化设计器以获得更简单的表单,并且只在绝对必要时动态创建和添加对象。

(FWIW,您发布的代码段可能会被简化和/或重构,因为它似乎朝着错误的方向发展。)

答案 4 :(得分:1)

假设您正在谈论动态对象的创建:

你显然需要一个库来支持这个,除非你想自己进入Reflection.Emit - LinFu在版本1中支持这个:

http://code.google.com/p/linfu/

然而,这是一个在版本2之前被删除的功能,我似乎记得。