2008-10-08 26 views
7

Một dòng của bảng được tạo ra sử dụng một asp: Repeater:ASP.NET: Làm thế nào để thiết lập lớp css của một điều khiển trong DataBind?

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

Bây giờ trong các dữ liệu-ràng buộc tôi muốn đánh dấu thông báo "chưa đọc" với một lớp css khác nhau, do đó web anh chàng có thể thực hiện bất cứ điều gì phong cách ông muốn phân biệt giữa đọc và thông báo chưa đọc:

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"; 
} 

trừ các diễn viên thất bại trong thời gian chạy:

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

hóa ra tha t HtmlTableRow có một hệ thống cấp bậc cha mẹ khác với WebControl:

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

đó là cuối cùng nơi WebControl đến từ

WebControl 
    : System.Web.UI.Control 

Vì vậy, tôi đã thay đổi mã để cố gắng sử dụng một System.Web.UI.Control thay vì:

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

Nhưng Control không chứa một định nghĩa cho CssClass:

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

vậy làm cách nào để tôi đặt tên lớp css cho thành phần <TR> trong DataBind?

Trả lời

8
HtmlControl htmlRow = (HtmlControl)row; 
    htmlRow.Attributes["class"] = htmlRow.Attributes["class"] + " announcementItemUnread"; 
0

Cast nó để HtmlTableRow

HtmlTableRow row = (HtmlTableRow)e.Item.FindControl("announcementRow"); 
+1

HtmlTableRow không chứa một tài sản hoặc CssName: 'System.Web.UI.HtmlControls.HtmlTableRow' không chứa một định nghĩa cho các phần tử –

0

Tại sao không chỉ ràng buộc trong khai báo?

<tr id="announcementRow" runat="server" class="<#% functionToDetermineWhichtoShow(ItemInBoundSetToPass) %>">...</tr> 
+0

tr 'CssClass' không có một CssClass, chỉ ASP.NET điều khiển làm . Trong trường hợp này, bạn cần một hàm để thiết lập thuộc tính lớp. Có lẽ dễ dàng hơn chỉ để làm điều đó trong code-behind. – tvanfosson

+0

Ngoài ra, tôi không muốn giấu tên lớp css mà tôi sẽ gán quá nhiều từ nhà thiết kế web. –

1

HtmlTableRow htmlRow = (HtmlTableRow) row;
htmlRow.Attributes.Add ("class", "notificationItemUnread");

Các vấn đề liên quan