You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中如何用findControl获取Repeater内动态ID的Div并修改样式

解决Repeater中动态绑定ID的Div无法通过FindControl获取的问题

我来帮你分析下问题出在哪,以及怎么快速解决:

你遇到的问题核心有两个:

  • 你的<div>没有添加runat="server"属性,它不是服务器端控件,ASP.NET不会在服务器端跟踪这个元素,所以FindControl自然找不到它。
  • 在ItemDataBound事件里循环所有attivita集合是逻辑错误——这个事件每触发一次,只对应Repeater里的一条数据项,你不需要遍历所有数据,只需要处理当前绑定的这条即可。

步骤1:修改ASPX中的Div标记

给需要在服务器端操作的Div添加runat="server",同时可以用固定的服务器端ID(更方便查找),用data-*属性保留数据源的原始ID:

<asp:Repeater runat="server" ID="rptDaFare" DataSourceID="SqlAttivitaDaFare">
<ItemTemplate>
<%-- 添加runat="server",设置固定服务器端ID,用data-id存储原始ID --%>
<div id="divAttivita" runat="server" data-id='<%# Eval("id") %>'>
<div class="div-titolo" title="<%# Eval("Titolo") %>"><%# Eval("Titolo") %></div>
<div class="div-testo" title="<%# Eval("Note") %>"><%# Eval("Note") %></div>
<!-- 以下原有代码保持不变 -->
<div>
<table style="width: 100%;margin-top:0.5em;padding-right:0.2em;">
<tr>
<td style="width: 50%; text-align: left;">
<asp:ImageButton runat="server" ImageUrl="~/images/gabri.png" Width="2.3em" Height="2.3em" ToolTip='<%#Eval("tecnico")%>' Enabled="false" Visible='<%# IIf(Eval("idutente") = 8, True, False) %>'/>
<asp:ImageButton runat="server" ImageUrl="~/images/giuse.png" Width="2.3em" Height="2.3em" ToolTip='<%#Eval("tecnico")%>' Enabled="false" Visible='<%# IIf(Eval("idutente") = 2, True, False) %>'/>
<asp:ImageButton runat="server" ImageUrl="~/images/robi.png" Width="2.3em" Height="2.3em" ToolTip='<%#Eval("tecnico")%>' Enabled="false" Visible='<%# IIf(Eval("idutente") = 5, True, False) %>'/>
</td>
<td style="width: 50%; text-align: right; ">
<asp:LinkButton CommandName="delAttivita" CommandArgument='<%#Eval("ID")%>' runat="server" ID="lnkDelAtt" CausesValidation="False" OnClientClick="return confirm('Sei sicuro di voler eliminare questa attivita?');"><i class="fa fa-trash fa-lg" title="Elimina attività"></i></asp:LinkButton>
<asp:LinkButton CommandName="editAttivita" CommandArgument='<%#Eval("ID")%>' runat="server" ID="lnkEditAtt"><i class="fa fa-pencil-square fa-lg" title="Modifica attività"></i></asp:LinkButton>
</td>
</tr>
</table>
</div>
</div>
</ItemTemplate>
</asp:Repeater>

步骤2:修正后台ItemDataBound事件逻辑

去掉循环所有数据的代码,直接处理当前RepeaterItem绑定的数据项:

Private Sub rptDaFare_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles rptDaFare.ItemDataBound
    If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
        ' 获取当前Item绑定的活动数据(请确保Attivita是你的实体类名)
        Dim currentAttivita = DirectCast(e.Item.DataItem, Attivita)
        If currentAttivita IsNot Nothing Then
            ' 找到服务器端的Div控件
            Dim div As HtmlGenericControl = TryCast(e.Item.FindControl("divAttivita"), HtmlGenericControl)
            If div IsNot Nothing Then
                ' 解析目标日期
                Dim data As Date = Date.ParseExact(txtData.Text, "dd/MM/yyyy", CultureInfo.CreateSpecificCulture("en-US")).Date
                ' 根据条件设置背景色
                If currentAttivita.DataInizio.HasValue AndAlso currentAttivita.DataInizio.Value <= Date.Today Then
                    div.Style("background-color") = "red"
                Else
                    div.Style("background-color") = "antiquewhite"
                End If
            End If
        End If
    End If
End Sub

关键修改说明:

  1. 获取当前数据项:通过e.Item.DataItem拿到当前RepeaterItem对应的那条数据,这才是ItemDataBound事件的正确用法,避免无效循环。
  2. 空值判断:增加了currentAttivita IsNot Nothing和div IsNot Nothing的判断,防止出现空引用异常。
  3. 日期判断优化:先检查DataInizio是否有值,避免null值引发错误。

内容的提问来源于stack exchange,提问作者Gabriele Cozzolino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:23:57