2010-01-15 51 views
4

嗨,我想控件添加到我的形式與一般的方法,是這樣的:如何動態添加(未知類型)控件到表單?

void addcontrol(Type quien) 
{ 
    this.Controls.Add(new quien);    
} 

private void btnNewControl_Click(object sender, EventArgs e) 
{ 
    addcontrol(typeof(Button)); 
} 

這可能嗎?

+0

只要注意添加一個只有默認屬性值的控件是沒有用的。遲早,你真的*會*關心它是什麼樣的控制。 – 2010-01-15 22:54:41

+0

@nobugz:這是當屬性網格進入行動! – Luiscencio 2010-01-15 22:57:33

+0

製作您自己的設計師,是嗎? Grokking TypeConverter和PropertyDescriptor呢?這是一個狂野的旅程。 – 2010-01-16 00:39:02

回答

7

你可以使用Activator.CreateInstance創建類型實例的新實例:

void AddControl(Type controlType) 
{ 
    Control c = (Control)Activator.CreateInstance(controlType); 
    this.Controls.Add(c); 
} 

這將是更好地使一個通用版本:

void AddControl<T>() where T : Control, new() 
{ 
    this.Controls.Add(new T()); 
} 
+0

這太酷了,我會哭的! thxs – Luiscencio 2010-01-15 23:14:44

+0

+1爲通用版本。只要OP不關心Control基本提供的功能,這種方式就可以正常工作。 – 2010-01-16 00:57:46

1

這當然會影響工作

void addcontrol(Control ctl) 
{ 
    this.Controls.Add(ctl);    
} 

private void btnNewControl_Click(object sender, EventArgs e) 
{ 
    addcontrol(new Button()); 
} 
+0

這很好,但是如果你想檢查一下這種類型的控件是否已經存在BEEFORE創建一個新的? – Luiscencio 2010-01-15 22:55:21

+0

您可以在表單中擁有多個相同類型的控件。 – 2010-01-15 22:57:17

+0

是的,但它會使用可以用在許多很多很棒的東西中的內存。 – Luiscencio 2010-01-15 22:59:27