在PreInit事件中(也嘗試了Load事件),我在運行時根據後端條件動態添加自定義用戶控件。我的問題是添加到頁面的用戶控件沒有采用網站當前設置的主題,並且正在使用其中的所有控件的默認樣式。如何設計動態添加的控件?
如何去修復呢?我很難用google找到任何特別相關的東西。
在PreInit事件中(也嘗試了Load事件),我在運行時根據後端條件動態添加自定義用戶控件。我的問題是添加到頁面的用戶控件沒有采用網站當前設置的主題,並且正在使用其中的所有控件的默認樣式。如何設計動態添加的控件?
如何去修復呢?我很難用google找到任何特別相關的東西。
一堆的方式來做到這一點。
MyControl.Attributes.Add("class", "myclass")
MyControl.Style.Add("background-color", "red")
MyControl.Attributes("bgcolor") = "lightblue"
想通了。我的網站將當前主題保存在初始加載的會話變量中。在我將控件動態添加到頁面後,我使用會話變量重新應用我的主題。我動態添加的控件然後採取適當的主題。
也許你可以分享一些代碼? – Brabbeldas 2014-01-09 09:46:41
試圖從他們的造型離婚的ASP.NET控件盡你所能。使用CSS類可以讓你輕鬆做到這一點。你沒有發佈代碼示例,所以我只能猜測你的自定義控件的樣子。他們可能有某種形式的容器,如div。確定哪個圖層將處理CSS類結構,向標記的該圖層添加一個asp:Literal,然後將Literal的Text屬性作爲控件的公共屬性公開。在運行時,當您創建控件並將其添加到Controls集合時,您可以爲該方案分配正確的類名稱。
這將是這個樣子:
<div class="<asp:Literal ID="uxCssClassLiteral" runat="server" />">
<p>My content goes here</p>
</div>
從後面的代碼
該頁面會處理這樣的控制:
public class MyPage
{
protected void Page_Load(Object sender, EventArgs e)
{
MyControlType controlA = new MyControlType();
if (condition1 == true)
{
controlA.CssClass = "class-name-for-condition-1";
}
else
{
controlA.CssClass = "class-name-for-other-condition";
}
this.Controls.Add(controlA);
}
}
嗨克里斯, 感謝您的反饋。我已經解決了這個問題並在上面發佈了我的解決方案。我們的皮膚工作方式是儘可能使用CSS類,並將這些類鏈接到我們的皮膚中。這是因爲我們發現皮膚創建了內聯樣式,這是一個禁忌。我們的皮膚只具有屬性,不能在CSS中設置,除此之外,它們只是鏈接到我們的CSS類。 再次感謝您花時間回覆。 – moonblade 2013-02-26 07:26:24
沒問題,你在我打字時發佈了你的答案。我之前使用過ASP.NET主題,發現它們可以達到某個特定的點,然後它們就會落在他們的臉上。我很好奇你在哪裏發現CSS不足,主題能夠進一步發展。如果您試圖從應用程序中獲取Web表單樣式,我建議您看看[CSSFriendly](http://cssfriendly.codeplex.com/)。它們是一組控件適配器,它們可幫助呈現更多以div爲導向的ASP.NET控件,而無需通常呈現的所有嵌套表格和內聯樣式。 – 2013-02-26 07:36:15
對不起,我遲到的回覆。 P 上的話題,它沒有那麼多CSS本身的任何缺點:我,除非我堅持的東西我無法通過廣泛的谷歌搜索解決不經常光顧這裏。簡而言之,我們會跟蹤客戶端在數據庫中使用的皮膚/主題,並通過服務器端代碼加載它。我很確定它不是絕對最好的方法,但是對於我們目前的目的來說它是有效的。在未來,如有必要,我們可能會研究另一種方法。 – moonblade 2013-05-20 13:12:42
對不起,我想我需要闡述。我正在使用asp.net皮膚/主題功能。我已經爲所有控件設置了皮膚。如果控件在設計時在頁面上,則它們會使用適當的主題/皮膚/樣式等進行渲染。如果我在運行時加載控件,則它們會呈現爲默認值。有沒有什麼辦法可以在不添加屬性的情況下將我的主題應用到新控件上? 編輯:想通了,請參閱我的回答 – moonblade 2013-02-26 07:06:17