轉換很簡單,甚至可以完全自動化。它只需要在需要嵌入ASCX控件的DLL項目中更改一些設置和基類。
1 ...對於每個UserControl,將ASCX文件的Build Action(屬性下)設置爲「Embedded Resource 「,並刪除其關聯的設計器文件。
2 ...保存該項目。
3 ...右鍵單擊該項目並選擇「卸載項目」。
4 ...再次右鍵單擊並選擇「編輯* .csproj」選項。
看起來像這樣(其中星號代表你的類名)段改爲:
<Compile Include="*.ascx.cs">
<DependentUpon>*.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
看起來像這樣
<Compile Include="*.ascx.cs" />
這將導致代碼隱藏文件單獨編譯的ASCX文件。
5 ...保存更改,然後右鍵單擊該項目並選擇「重新加載項目」。
6 ...打開所有「* .ascx.cs」文件,並使它們從以下自定義UserControl類繼承,而不是System.Web.UI.UserControl類(您可能需要找到父類類來完成這一步)。
public class UserControl : System.Web.UI.UserControl
{
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
string content = String.Empty;
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType().FullName + ".ascx");
using (StreamReader reader = new StreamReader(stream))
content = reader.ReadToEnd();
Control userControl = Page.ParseControl(content);
this.Controls.Add(userControl);
}
}
這個基類將加載和分析嵌入式ASCX文件的照顧。
7 ...最後,你需要放置在子文件夾ASCX文件,使他們的資源名稱(通過文件夾路徑自動確定)匹配其關聯的類的完整類型名稱(加「的.ascx」)。假設您的根名稱空間與您的項目名稱相匹配,那麼名爲「ProjectName.Namespace1.Namespace2.ClassName」的類將需要子文件夾「Namespace1 \ Namespace2」中的ASCX文件,因此它會嵌入名稱「ProjectName.Namespace1.Namespace2」。 ClassName.ascx」。
就是這樣!一旦編譯DLL並將其包含在另一個項目中,就可以像使用其他類一樣使用「new」運算符實例化用戶控件的實例。與往常一樣,一旦將控件作爲子控件添加到頁面上的頁面或另一個控件上,您的控件就會「抓住」當前頁面事件。
你analized我粘貼的解決方案?它非常適合創建用戶控制庫。如果可能的話,我會避免創建用戶控件庫,但如果你沒有選擇看看文章 – 2010-05-10 21:35:51