ASP.NET: как установить класс css элемента управления во время DataBind? - PullRequest
7 голосов
/ 08 октября 2008

Строка таблицы генерируется с использованием asp: Repeater:

<asp:repeater ID="announcementsRepeater" OnItemDataBound="announcementsRepeater_ItemDataBound" runat="Server">
   <itemtemplate>
      <tr id="announcementRow" class="announcementItem" runat="server">...</tr>
   </itemtemplate>
</asp:repeater>

Теперь в привязке данных я хочу пометить «непрочитанные» объявления другим классом css, чтобы веб-парень мог выполнить любой стиль, который он хочет различать между прочитанными и непрочитанными объявлениями:

protected void announcementsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
      return;

   // get the associated data item
   Announcement announcement = (Announcement)e.Item.DataItem;

   WebControl row = (WebControl)e.Item.FindControl("announcementRow");
      if (row != null)
         row.CssClass = row.CssClass + " announcementItemUnread";
}

за исключением того, что приведение не выполняется во время выполнения:

System.InvalidCastException occurred
  Message="Unable to cast object of type 'System.Web.UI.HtmlControls.HtmlTableRow' to type 'System.Web.UI.WebControls.WebControl'."

Оказывается, у HtmlTableRow родительская иерархия отличается от WebControl:

HtmlTableRow
   : HtmlContainerControl
      : HtmlControl
         : System.Web.UI.Control

Именно отсюда и происходит WebControl

WebControl
   : System.Web.UI.Control

Поэтому я изменил код, чтобы попытаться использовать вместо него System.Web.UI.Control:

Control row = (Control)e.Item.FindControl("announcementRow");
if (row != null)
   row.CssClass = row.CssClass + " announcementItemUnread";

Но Control не содержит определения для CssClass:

'System.Web.UI.Control' does not contain a definition for 'CssClass'    

как мне установить имя класса css для элемента <TR> во время DataBind?

Ответы [ 4 ]

8 голосов
/ 08 октября 2008
   HtmlControl htmlRow = (HtmlControl)row; 
   htmlRow.Attributes["class"] = htmlRow.Attributes["class"] + " announcementItemUnread";
1 голос
/ 12 ноября 2008

HtmlTableRow htmlRow = (HtmlTableRow) row;
htmlRow.Attributes.Add ( "класс", "announcementItemUnread");

0 голосов
/ 08 октября 2008

Почему бы просто не связать в декларации?

<tr id="announcementRow" runat="server" class="<#% functionToDetermineWhichtoShow(ItemInBoundSetToPass) %>">...</tr>
0 голосов
/ 08 октября 2008

Приведите его к HtmlTableRow

HtmlTableRow row = (HtmlTableRow)e.Item.FindControl("announcementRow");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...