<td> 標記了 runat="server" 且有 id,但在後台 FindControl 找不到,無法動態控制列可見性。
Repeater 會為每個數據行創建獨立的命名容器,td 的 id 僅在對應的 RepeaterItem 作用域內有效,頁面級 FindControl 無法跨越命名容器邊界。
<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") %>',無需後台代碼。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 |