澄清一下,您要做的是在運行時以編程方式將用戶控件添加到 Web 窗體頁面。 有幾種方法可以實現這一點。
在我們開始之前,值得注意的是,您編寫的代碼可能“有效”,因為它可以編譯並且不會拋出運行時錯誤。 但它也沒有執行控制。 我懷疑如果您查看您的 HTML,您會發現控件聲明是作為字符串文字輸出的(即,未由服務器處理)。 然后它會被瀏覽器忽略,因為它不知道<moncontrol:exemple />
標簽代表什么。 這顯然不是你想要的。
建立控制容器
無論您采用哪種方法,您都希望從頁面上的某種類型的容器開始,您可以將控件添加到其中,例如Panel
。 如果您不希望容器輸出任何包裝標記,您可以使用Placeholder
:
<asp:Placeholder id="ControlContainer" runat="server" />
這與您當前的Text
控件的用途相似,但其唯一目的是提供一個容器,您將向其中添加用戶控件。 但是,從 ASP.NET 的角度來看,根據您的請求,這可以是任何類型的服務器控件,包括<script runat="server">
。 稍后再談。
以編程方式創建控件
接下來,您將以編程方式創建控件。 這是我們遇到各種選擇的地方。 最通用的方法是使用ParseControl()
方法( 參考)。 這看起來像這樣:
Control control = Page.ParseControl("<%@ Register assembly=\"App_Web_exemple.ascx.cc671b29\" namespace=\"Moncontrol\" tagprefix=\"moncontrol\" %><moncontrol:exemple ISBN=\"9782894646151\" runat=\"server\" />");
這將使用處理頁面上的聲明性語法的相同方法解析控件,並返回一個Control
對象,其中您的Exemple
控件作為其Controls
集合中的第一個Controls
。
但是,我發現該語法有點草率,因為它將 .NET 對象及其屬性表示為字符串文字。 鑒於此,有一些更清潔的方法。 在這種情況下,您的控件似乎正在被編譯為程序集,因此可能定義了一個繼承自UserControl
的代碼UserControl
。 如果是這樣,您應該能夠簡單地執行以下操作:
Exemple control = new Exemple();
然后以編程方式設置它的屬性,就像在任何其他 C# 對象中一樣。 干凈多了!
如果您的控件不是由服務器動態編譯,那么您應該使用帶有LoadControl()
方法的Reference
指令,如 MSDN 文章如何:以編程方式創建 ASP.NET 用戶控件的實例中所述。 然而,我不相信這種方法對你有用。
將控件實例添加到頁面
無論您采用哪種方法,下一步都是相同的:然后將您以編程方式添加到頁面的Controls
添加到目標容器的Controls
集合中。 例如,:
ControlContainer.Controls.Add(control);
注意:您可以在技術上只添加這在Page
類的Control
集合,太多,但不給你過在網頁上它被放置任何控制; 擁有PlaceHolder
控件(或等效控件)可讓您准確指定希望控件出現的位置。
我希望這有幫助。 根據您編寫和編譯控件的方式,有幾個注意事項,但這應該為您提供解決問題所需的基本結構。