您可以通过哪些方式在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);
}
这是一个与我所说的很接近的代码片段。我发了另一篇文章,但没有把这个问题写得很对。我将删除它,但它仍然可以查看。
如果仍有问题请建设性我不介意否定输入,只要它有用。
编辑: 我能够得到一些我正在寻找的答案。谢谢所有回复的人。当我能够时,我会关闭它。如果其他人可以关闭它,那将是值得赞赏的。
答案 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 };
规定还有更多,但这些很重要。
答案 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...
答案 3 :(得分:2)
动态创建GUI对象非常有用,但是,它也可能是维护的噩梦。
一个好的经验法则是限制动态创建的GUI对象的数量。
实际上想要使用动态创建的GUI对象的一种情况是,当您不知道所需对象的数量或数量时。例如,结果集中每行的一个标签(即使这样,您可以考虑使用DataGrid或GridView类型对象)。
这适用于WinForms和ASP.NET。请务必正确记录您的代码。
我的建议是坚持使用可视化设计器以获得更简单的表单,并且只在绝对必要时动态创建和添加对象。
(FWIW,您发布的代码段可能会被简化和/或重构,因为它似乎朝着错误的方向发展。)
答案 4 :(得分:1)
假设您正在谈论动态对象的创建:
你显然需要一个库来支持这个,除非你想自己进入Reflection.Emit
- LinFu在版本1中支持这个:
http://code.google.com/p/linfu/
然而,这是一个在版本2之前被删除的功能,我似乎记得。