3

GridView 内の要素の CSS クラスに基づいて、ページのスタイルをプログラムで切り替えようとしています。いくつかの通常の (テンプレート化されていない) 要素のクラス属性でこれを成功させましたが、何らかの理由でテンプレート コントロール内では機能しないようです。Visual Studio は、データ バインディング コードを不透明なテキストとして扱います (実際、それに応じて不透明な文字列に色を付けます)。と では、この方法でデータバインディングはサポートされていませんか?

これが事実であると言うクラスのドキュメントには何も見つかりませんが、一方でそれは機能せず、Visual Studio はこれが設計どおりであることを示唆しているようです。

編集:例。ここでは、Gridview が宣言されており、列の定義で、ItemStyle-CssClass 属性が 2 つの値に設定されています。1 つはハードコードされ、もう 1 つは列挙型変数の現在の値から取得されます。この場合、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" >

4

2 に答える 2

2

探していたものが見つかりました。<%$ %> コンストラクトを使用した ASP.NET Expression Builder について説明しているこの記事からほぼ完全に引用されています。私の例のコンテキストでは、解決策は次のとおりです。

マークアップ:

<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 <%$ Code: ... %>」ではなく、その内部で文字列を構築することを意味します。
  • この場合、文字列の作成に二重引用符が使用されるため、値には単一引用符を使用する必要があります。

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 にあります。これを自分の目的に合わせるための作業はほとんどしませんでした。

于 2012-12-16T00:33:09.547 に答える
0

そんなことはできません。できることは、2 つの異なるスキンを作成することです。スキンでは、現在と同じ css フィールドを設定できます。したがって、PartyMode を使用しないスキンと、PartyMode を使用するスキンを 1 つずつ作成します。で必要なスキンを設定できます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";
        }
于 2012-12-15T06:28:13.597 に答える