리피터가 포함 된 ASP.NET 사용자 정의 컨트롤을 만들고 있습니다. ItemTemplate에서 PlaceHolder를 삭제했습니다. 데이터 소스의 부울 필드가 참일 때마다 Place Holder에 Group Header를 표시하려고합니다.코드에서 PlaceHolder를 참조 할 수 없습니다.
리피터가 올바르게 작동하고 그룹 머리글을 제외한 모든 데이터가로드되고 표시됩니다. 그러나 Visual Studio에서는 코드에서 PlaceHolder를 참조 할 수 없습니다. 오류 메시지는 "이름 'PlaceHolder1'이 (가) 현재 컨텍스트에 존재하지 않습니다." 다른 비슷한 문제를 보았고 FindControl을 사용해 보았지만 null을 반환합니다.
<%@ Control Language="C#" ClassName="Table1Control" AutoEventWireup="true" CodeBehind="Table2View.ascx.cs" Inherits="CCC.Table2View" %>
<table>
<asp:Repeater ID="Table2List" runat="server" onitemdatabound="Table2List_ItemDataBound">
<HeaderTemplate>
<tr class="Table2HeaderRow">
<th class = "Table2Col1Hdr">Test/Report Group</th>
<th class = "Table2Col2Hdr">Agent</th>
<th class = "Table2Col3Hdr">Disk Content</th>
<th class = "Table2CriteriaSetHdr">
<table class="Table2CriteriaSetTable">
<tr class="Table2CriteriaSetInnerRow">
<td class = "Table2CriteriaSetTopHdr" colspan=3>Zone Diameter </td></tr>
<tr class="Table2CriteriaSetInnerRow">
<td class="Table2CriteriaSetSHdr">S</td>
<td class="Table2CriteriaSetIHdr">I</td>
<td class="Table2CriteriaSetRHdr">R</td>
</tr>
</table>
</th>
<th class = "Table2CriteriaSetHdr">
<table class="Table2CriteriaSetTable">
<tr class="Table2CriteriaSetInnerRow">
<td class = "Table2CriteriaSetTopHdr" colspan=3>MIC Interperetive </td></tr>
<tr class="Table2CriteriaSetInnerRow">
<td class="Table2CriteriaSetSHdr">S</td>
<td class="Table2CriteriaSetIHdr">I</td>
<td class="Table2CriteriaSetRHdr">R</td>
</tr>
</table>
</th>
<th class = "Table2Col5Hdr">Comments</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<tr class = "<%# "Table2ItemRow" + Eval("IsNewDrugId").ToString() %>" >
<td class="Table2ItemCol1"><asp:Label runat="server" ID="lblId"><%#Eval("TRGroup")%></asp:Label></td>
<td class="Table2ItemCol2"><asp:Label runat="server" ID="Label1" class="AgentName"><%#Eval("_Agent.Name")%></asp:Label></td>
<td class="Table2ItemCol3"><asp:Label runat="server" ID="Label2"><%#Eval("DiskContent")%></asp:Label></td>
<td class="Table2CriteriaSetItem">
<table class="Table2CriteriaSetTable">
<tr class="Table2CriteriaSetInnerRow">
<td class="Table2ItemS"><asp:Label runat="server" ID="Label3"><%#Eval("ZoneDiameterS")%></asp:Label></td>
<td class="Table2ItemI"><asp:Label runat="server" ID="Label4"><%#Eval("ZoneDiameterI")%></asp:Label></td>
<td class="Table2ItemR"><asp:Label runat="server" ID="Label5"><%#Eval("ZoneDiameterR")%></asp:Label></td>
</tr>
</table></td>
<td class="Table2CriteriaSetItem">
<table class="Table2CriteriaSetTable">
<tr class ="Table2CriteriaSetInnerRow">
<td class="Table2ItemS"><asp:Label runat="server" ID="Label6"><%#Eval("MICriteriaS")%></asp:Label></td>
<td class="Table2ItemI"><asp:Label runat="server" ID="Label7"><%#Eval("MICriteriaI")%></asp:Label></td>
<td class="Table2ItemR"><asp:Label runat="server" ID="Label8"><%#Eval("MICriteriaR")%></asp:Label></td>
</tr>
</table></td>
<td class="Table2ItemCol10"><asp:Label runat="server" ID="Label9"><%#Eval("Comment")%></asp:Label></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
그리고 뒤에있는 코드 :
protected void Table2List_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//PlaceHolder1.Controls.Clear(); // Can't find this ???
///PlaceHolder groupHeader = (PlaceHolder)FindControl("PlaceHolder1"); // returns null???
PlaceHolder groupHeader = (PlaceHolder)e.Item.FindControl("PlaceHolder1"); // as suggested by Servy, still returns null
groupHeader.Controls.Clear();
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Table2Row T2Data = (Table2Row)e.Item.DataItem;
if (T2Data.IsNewGroup)
{
TableRow tr = new TableRow();
tr.CssClass = "Table2GroupHeader";
TableCell td = new TableCell();
td.ColumnSpan = 6;
Label lbl = new Label();
lbl.Text = T2Data.GroupHeader;
td.Controls.Add(lbl);
tr.Controls.Add(td);
groupHeader.Controls.Add(tr);
}
}
}
나는 이것이 그럴 것이라고 생각했지만 여전히 null을 반환합니다. 나는 내가 시도한 것을 보여주기 위해 코드를 편집 할 것이다. –
@SteveWash 자리 표시자는 헤더가 아닌 일반 항목에만 존재하기 때문에 코드를'if' 블록 내부로 옮겨야합니다. – Servy
완벽하게 작동합니다. 고마워요, 고마워요. –