在具有动态分配 ID 的嵌套转发器中将 class 附加或添加到 div?

Append or add a class to a div in a nested repeater with a dynamically assigned ID?

我在另一个中继器中安装了这个中继器。

<asp:Repeater ID="rpDB_item" runat="server" OnItemDataBound="rpDB_item_ItemDataBound">
   <ItemTemplate>
        <div class="row anj" id="ncollapse<%# ((((RepeaterItem)Container.Parent.Parent).ItemIndex)) %>" >
        ...
        </div>                                              
    </ItemTemplate>
</asp:Repeater> 

我想做的是用 id=ncollapse(x).collapsed 附加到行的 class。例如,可能会有多个带有 id=ncollapse4 的 div。我如何将代码隐藏 (C#) 中的 class 附加到带有 .collapsed class 的 div?或者在 aspx 页面上设置内联 class 会更好吗?我更愿意使用 switch 作为定义语句,因为 sStatus 可能有几个选项。

我试过了
HtmlGenericControl nc = (HtmlGenericControl)(e.Item.FindControl("ncollapse"+((((RepeaterItem)e.Item.Parent.Parent).ItemIndex).ToString())));

然后设置 nc.Attributes["class"] = "collapsed" 在后面的代码中,但在 nc 上得到一个空引用(它似乎总是空的);还有,

<div class="row anj <%# switch (DataBinder.Eval(Container.DataItem,"sStatus").ToString())
{ case "OFFLINE": case "RECOVERY_PENDING": case "UNKNOWN":
        Response.Write("collapsed");
        break;
  default:
        Response.Write("");
        break;
 };%> id="<%# (DataBinder.Eval(Container.DataItem,"sStatus").ToString() == "OFFLINE" ? "n" : "ncollapse"+((((RepeaterItem)Container.Parent.Parent).ItemIndex).ToString())) %>">

switch 给我一个错误。不确定我要去哪里或下一步该去哪里。想法?

可能有一种方法可以使您的 aspx 语法正确,但它值得吗?它几乎不可读。我建议将此逻辑移到代码后面,然后从标记中调用它。易写、易读、易管理。

页面后面的代码:

protected string getRowCollapsedClass(String sStatus)
{
    switch (sStatus)
    {
        case "OFFLINE":
        case "RECOVERY_PENDING":
        case "UNKNOWN":
            return "collapsed";
        default:
            return String.Empty;
    }
}

然后标记变得非常简单:

<div class='row anj <%# getRowCollapsedClass(Eval("sStatus").ToString()) %>'

id 值也是如此。请记住将索引作为第二个参数传递。