首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET Repeater 控制項:後台動態控制列顯示/隱藏

     編輯:程式設計綜合問答

問題場景

內部 <td> 標記了 runat="server" 且有 id,但在後台 FindControl 找不到,無法動態控制列可見性。

根本原因

Repeater 會為每個數據行創建獨立的命名容器,td 的 id 僅在對應的 RepeaterItem 作用域內有效,頁面級 FindControl 無法跨越命名容器邊界。

正確解法:ItemDataBound 事件

<asp:Repeater ID="rptList" runat="server" OnItemDataBound="rptList_ItemDataBound">
    <ItemTemplate>
        <td id="td_KENSYU_MEI_KJ" runat="server" visible="false">...</td>
        <td id="td_JOBNO" runat="server" visible="false">...</td>
        ...
    </ItemTemplate>
</asp:Repeater>
protected void rptList_ItemDataBound(object sender, RepeaterItemEventArgs e) {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
        // 在當前行的命名容器內查找
        HtmlTableCell td1 = (HtmlTableCell)e.Item.FindControl("td_KENSYU_MEI_KJ");
        HtmlTableCell td2 = (HtmlTableCell)e.Item.FindControl("td_JOBNO");
        // 根據業務條件控制
        bool show = /* 條件 */;
        td1.Visible = show;
        td2.Visible = show;
        // 其他列同理...
    }
}

進階技巧

  • 數據綁定表達式:直接在標記中綁定 Visible='<%# Eval("SomeFlag") %>',無需後台代碼。
  • CSS 控制:給列統一加 class,前端用 JS/jQuery 切換 display:none,減輕服務端壓力。
  • 性能優化:大數據量時考慮 EnableViewState="false" 或改用 ListView/GridView。

常見錯誤對照

錯誤寫法正確寫法
this.FindControl("td_KENSYU_MEI_KJ")e.Item.FindControl("td_KENSYU_MEI_KJ")
在 Page_Load 中查找在 ItemDataBound 中查找
忽略 ItemType 判斷先判斷 Item/AlternatingItem
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved