A table row is generated using an asp:Repeater:
<asp:repeater ID="announcementsRepeater" OnItemDataBound="announcementsRepeater_ItemDataBound" runat="Server">
<itemtemplate>
<tr id="announcementRow" class="announcementItem" runat="server">...</tr>
</itemtemplate>
</asp:repeater>
Now in the data-bind i want to mark "unread" announcements with a different css class, so that the web-guy can perform whatever styling he wants to differentiate between read and unread announcements:
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";
}
except the cast fails at runtime:
System.InvalidCastException occurred
Message="Unable to cast object of type 'System.Web.UI.HtmlControls.HtmlTableRow' to type 'System.Web.UI.WebControls.WebControl'."
It turns out that HtmlTableRow
has a different parent heirarchy than WebControl
:
HtmlTableRow
: HtmlContainerControl
: HtmlControl
: System.Web.UI.Control
which is ultimately where WebControl comes from
WebControl
: System.Web.UI.Control
So i changed the code to try to use a System.Web.UI.Control instead:
Control row = (Control)e.Item.FindControl("announcementRow");
if (row != null)
row.CssClass = row.CssClass + " announcementItemUnread";
But Control
doesn't contain a definition for CssClass
:
'System.Web.UI.Control' does not contain a definition for 'CssClass'
so how do i set the css class name for a <TR>
element during DataBind?