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
关键修改说明:
- 获取当前数据项:通过
e.Item.DataItem拿到当前RepeaterItem对应的那条数据,这才是ItemDataBound事件的正确用法,避免无效循环。 - 空值判断:增加了
currentAttivita IsNot Nothing和div IsNot Nothing的判断,防止出现空引用异常。 - 日期判断优化:先检查
DataInizio是否有值,避免null值引发错误。
内容的提问来源于stack exchange,提问作者Gabriele Cozzolino
相关产品推荐
相关产品推荐

