如何动态设置ASP.net Listview LayoutTemplate的样式?

时间:2011-12-16 19:40:31

标签: c# asp.net listview

我希望能够将用户选择的颜色和字体大小应用到Listview的LayoutTemplate中的控件,但不能使用代码块来调整样式(Codeblocks在ItemTemplate中工作得很好)。我读过一些文章,说明代码块在LayoutTemplate中不起作用(并且有第一手经验,它们不起作用)。有没有人有可靠的方法让我调整风格?我应该在某个事件处理程序中使用FindControl()并在那里添加样式吗?

2 个答案:

答案 0 :(得分:0)

用户可以自定义的任何内容(在设计时未修复)都需要通过查找适当的控件并更改CSS类来应用于ListView。或者,您可以尝试动态地编写出针对ListView中元素类的CSS,并纯粹使用CSS更改颜色。

编辑:要动态输出CSS,请考虑使用LiteralControl,如:

protected override void OnLoad(EventArgs e)
{
   var profile = GetProfile();

   LiteralControl ctl = new LiteralControl(@"
     <style>
         .UserStyleA 
         { 
            background-color: " + profile.BackgroundColor + @";
            color: " + profile.ForeColor + @";
     </style>");         
}

我相信然后onload,你可以附加到标题,如:

this.Page.Header.Controls.Add(ctl);

但是,在阅读Page.header属性的文档时,它有一个动态附加样式表的好例子。这似乎正是你所需要的。

http://msdn.microsoft.com/en-us/library/system.web.ui.page.header.aspx

答案 1 :(得分:0)

您可以尝试在LayoutTemplate中放置一个用户控件并将逻辑移动到所述用户控件,如下所示:

<asp:ListView ID="CustomizableList" runat="server">
  <LayoutTemplate>
    <custom:UserStyles runat="server" />

    <div class="user-list-layout">
      <asp:PlaceHolder ID="Item" />
    </div>
  </LayoutTemplate>
  <ItemTemplate>
    <asp:Label ID="Something" runat="server" 
      Text='<%# Eval("Something") %>' 
      CssClass="user-list-something" />
  </ItemTemplate>
</asp:ListView>

按照Brian Mains的建议表单的回答,只使用CSS类。然后在UserStyles控件中,您可以动态生成一些将应用的CSS。

<style type="text/css" scoped>
  .user-list-layout {
    border-color: <%= Profile.FavoriteColor %>;
  }
  .user-list-something {
    font-size: <%= Profile.PreferredFontSizeForSomething %>;
  }
</style>

但请注意,HTML中不允许将<style>标记添加到<body>,但适用于所有主流浏览器。它在HTML5中允许,但只能设置scoped属性(有关详细信息,请参阅this question)。