轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-27 14:43:42.000|閱讀 629 次
概述:本文主要講解如何在.NET上如何根據(jù)字符串動(dòng)態(tài)創(chuàng)建控件。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
首先,利用System.Type.GetType方法,獲得字符串中指定的控件的類(lèi)型實(shí)例。
這里需要注意這個(gè)字符串的語(yǔ)法,根據(jù)msdn的解釋?zhuān)?/p>
不對(duì)數(shù)組或 COM 類(lèi)型執(zhí)行搜索,除非已將它們加載到可用類(lèi)表中。
typeName 可以是簡(jiǎn)單的類(lèi)型名、包含命名空間的類(lèi)型名,或是包含程序集名稱(chēng)規(guī)范的復(fù)雜名稱(chēng)。
如果 typeName 只包含 Type 的名稱(chēng),則此方法先是在調(diào)用對(duì)象的程序集中進(jìn)行搜索,然后在 mscorlib.dll 程序集中進(jìn)行搜索。如果 typeName 用部分或完整的程序集名稱(chēng)完全限定,則此方法在指定的程序集中進(jìn)行搜索。
AssemblyQualifiedName 可以返回完全限定的類(lèi)型名稱(chēng)(包含嵌套類(lèi)型和程序集名稱(chēng))。所有支持公共語(yǔ)言運(yùn)行庫(kù)的編譯器將發(fā)出嵌套類(lèi)的簡(jiǎn)單名稱(chēng),并且當(dāng)被查詢(xún)時(shí),反射依照下列約定構(gòu)造一個(gè) mangled 名稱(chēng)。
例如,類(lèi)的完全限定名可能類(lèi)似于如下形式:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
但是直接使用Type.GetType("System.Windows.Forms.TextBox")獲得Type是Null。這是因?yàn)椋琖indows.Forms程序集是公有的程序集,是位于程序集緩存中的,而這個(gè)程序集有不同的版本,為了確定使用的版本,我們不僅要提供程序集的名稱(chēng),還要提供程序集的版本和強(qiáng)名稱(chēng)。照這個(gè)思路,在使用的.net Framework 1.1上,將這一句寫(xiě)成Type.GetType("System.Windows.Forms.CheckBox, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")。現(xiàn)在運(yùn)行就沒(méi)有問(wèn)題了。問(wèn)題是我們?nèi)绾稳〉盟肳indows.Forms程序集的版本和強(qiáng)名稱(chēng)?可以用GetType(CheckBox).AssemblyQualifiedName這樣的語(yǔ)法,一旦得到了這些信息,我們就可以將這些信息用于其它任何控件,因?yàn)樗麄兌紒?lái)自于同一個(gè)版本W(wǎng)indows.Forms程序集。
利用上面說(shuō)到的方法,現(xiàn)在就可以使用System.Activator.CreateInstance方法來(lái)創(chuàng)建一個(gè)TextBox控件了:
public static void CreateControl(string controlType, Form form, int positionX, int positionY)
{
try
{
string assemblyQualifiedName = typeof(System.Windows.Forms.Form).AssemblyQualifiedName;
string assemblyInformation = assemblyQualifiedName.Substring(assemblyQualifiedName.IndexOf(","));
Type ty = Type.GetType(controlType + assemblyInformation);
Control newControl = (Control)System.Activator.CreateInstance(ty);
form.SuspendLayout();
newControl.Location = new System.Drawing.Point(positionX, positionY);
newControl.Name = ty.Name + form.Controls.Count.ToString();
form.Controls.Add(newControl);
form.ResumeLayout();
}
catch(Exception ex)
{
throw ex;
}
}
調(diào)用: CreateControl("System.Windows.Forms.TextBox", this, 10, 10);
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載