2012-12-15 69 views
3

我想以編程方式在頁面中切換樣式,這是基於GridView中元素的CSS類。我已經成功地在幾個正常(非模板化)元素的類屬性中完成了這項工作,但出於某種原因,它似乎不適用於模板控件。 Visual Studio將數據綁定代碼視爲不透明文本(事實上,甚至將其作爲不透明字符串進行着色)。數據綁定是不是以這種方式支持和?是否不可能在GridView中聲明性地綁定ItemStyle上的CssClass屬性?

我在類文檔中找不到任何說明這種情況的東西,但另一方面,它不起作用,Visual Studio似乎暗示這是按設計進行的。

編輯:一個例子。這裏聲明瞭一個Gridview,並且在列定義中,ItemStyle-CssClass屬性被設置爲兩個值;一個是硬編碼的,另一個是取自一個枚舉變量的當前值。假設在這種情況下,StyleHelper是一個靜態類,Festivity屬性是StyleSelectorEnum類型,當前值是StyleSelectorEnum.PartyMode。

<asp:GridView runat="server"> 
    <Columns> 
     <asp:TemplateField ItemStyle-CssClass="style1 <%= Lib.Web.StyleHelper.Festivity.ToString() %>" /> 
      <ItemTemplate> 
       <div /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

在這個例子中,系統產生將包含與TD條目出現這樣的行表:

<td class="style1 <%= Lib.Web.StyleHelper.Festivity.ToString() %>" >

在實踐的時候,我本來希望它會是這樣的:

<td class="style1 PartyMode" >

+0

你可以發表某種例子嗎? – MadSkunk

+0

您是否使用'!important'來覆蓋任何未知/不可見的應用樣式? – bobthyasian

+0

@MadSkunk發表 - 希望有所幫助。 – bwerks

回答

2

我發現我一直在尋找。它幾乎完全來自this article,它討論了使用<%$%>構造的ASP.NET Expression Builders。在我的例子中,解決方案如下。

的標記:

<asp:GridView runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemStyle CssClass='<%$ Code: "style1 " + Lib.Web.StyleHelper.Festivity.ToString() %>' /> 
      <ItemTemplate> 
       <div /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 

注意事項:

  • 上的ItemTemplate的ItemStyle-CssClass屬性可能不會以這種方式使用。文字內容錯誤導致。
  • 的<%$%>構造必須填寫的整體價值,這意味着在我的情況做一個字符串建設它的內部,而不是「STYLE1 <%$代碼:...%>」
  • 的單引號必須在這種情況下,由於字符串構造中使用雙引號,因此可以使用該值。

聲明表達式生成器web.config中的部分:

<compilation debug="true"> 
    <expressionBuilders> 
     <add expressionPrefix="Code" type="CodeExpressionBuilder"/> 
    </expressionBuilders> 
</compilation> 

類定義本身,其被放置在的app_code:

[ExpressionPrefix("Code")] 
public class CodeExpressionBuilder : ExpressionBuilder 
{ 
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
    { 
     return new CodeSnippetExpression(entry.Expression); 
    } 
} 

現在,在該td元素結果表格按預期給予類「style1 PartyMode」。

此解決方案的全部功勞歸於他的博客中的InfinitiesLoop;我做了很少的工作來適應我的目的。

+0

不好的做法。不建設性。難以維護。 – Jeroen

+0

@Jeroen解釋爲什麼? – bwerks

+0

很好的答案,因爲我不知道這是可能的。但我選擇在代碼中使用'GridView.Columns [i] .ItemStyle.CssClass' – Bart

0

你不能那樣做。你可以做的是創建兩個不同的皮膚。在皮膚中,您可以像現在一樣設置相同的CSS字段。所以你創建一個沒有PartyMode和一個皮膚的皮膚。您可以在Page_PreInit中設置所需的皮膚。

在皮膚文件:

<ASP:GridView SkinId="Simple"> 
    <ItemStyle CssClass="style1"/> 
</ASP:GridView> 

<ASP:GridView SkinId="Party"> 
    <ItemStyle CssClass="style1 PartyMode"/> 
</ASP:GridView> 

在你的aspx:

<asp:GridView Id="GridView1" runat="server" SkinID="Simple"> 

在後面的代碼:

protected override void OnPreInit(EventArgs e) 
     { 
      base.OnPreInit(e); 

// based on your condition: 
this.GridView1.SkinID = "PartyMode"; 
     } 
+0

事實證明,這是可能的,沒有代碼隱藏。看到我的答案。 – bwerks

相關問題