Строка таблицы создается с помощью 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?





Приведите его в HtmlTableRow
HtmlTableRow row = (HtmlTableRow)e.Item.FindControl("announcementRow");
HtmlControl htmlRow = (HtmlControl)row;
htmlRow.Attributes["class"] = htmlRow.Attributes["class"] + " announcementItemUnread";
Почему бы просто не привязать декларацию?
<tr id = "announcementRow" runat = "server" class = "<#% functionToDetermineWhichtoShow(ItemInBoundSetToPass) %>">...</tr>
Элемент tr не имеет cssClass, только элементы управления ASP.NET. В этом случае вам понадобится функция для установки атрибута класса. Наверное, проще просто сделать это в коде программной части.
Кроме того, я бы предпочел не скрывать имена классов css, которые я буду назначать слишком много от веб-дизайнера.
HtmlTableRow htmlRow = (HtmlTableRow) строка;
htmlRow.Attributes.Add ("класс", "announcementItemUnread");
HtmlTableRow также не содержит свойства CssName: 'System.Web.UI.HtmlControls.HtmlTableRow' не содержит определения для 'CssClass'