我有一个带有ReportViewer控件的ASP.NET页面,它显示由GET参数指定的SSRS报告。我隐藏了ReportViewer的ParameterHeader并使用ListBox和CalendarExtender之类的控件在ASP.net页面上自己显示参数(我这样做是因为不是每个人都可以看到所有内容而我想控制选择的报表参数显示哪些部分。)
参数的数量/类型因报告而异,因此我对报告的参数(我使用<asp:Repeater>
获得了ServerReport.GetParameters()
数据绑定),并创建了下拉列表/文本框/日历控件动态地将它们添加到ParameterEntryPlaceholder
中的ReportParameterEditRepeater_ItemDataBound
。
<table><tr>
<td>
<asp:Repeater ID="ReportParameterEditRepeater" OnItemDataBound="ReportParameterEditRepeater_ItemDataBound" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<%#Container.ItemIndex % 4 == 0 ? "<tr>" : "" %>
<td><b><%#((ReportParameterInfo)Container.DataItem).Prompt %>: </b></td>
<td><asp:PlaceHolder runat="server" ID="ParameterEntryPlaceholder"></asp:PlaceHolder></td>
<%#Container.ItemIndex % 4 == 3 ? "</tr>" : "<td style='width: 20px;'></td>" %>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</td>
<td>
<asp:UpdatePanel ID="ReportRefreshUpdatePanel" ChildrenAsTriggers="True" runat="server">
<ContentTemplate>
<asp:Button ID="ViewReportBtn" runat="server" OnClick="ViewReportBtn_Click" Text="View Report" />
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr></table>
我的控件旁边有一个<asp:Button>
标记为“查看报告”,它会启动一个方法,用于收集所有参数控件的值,在ServerReport上设置它们,然后刷新报表异步。
但是,在“查看报告”回发期间,我无法看到动态创建的控件 - ParameterEntryPlaceholder为空。如果我重新绑定转发器,我可以看到它们,但如果我这样做,我就会失去用户的选择。
TL; DR - 在回页期间,如何在没有重新绑定的情况下,如何从页面加载期间的代码中访问我创建/添加到表单的控件?
答案 0 :(得分:2)
无论你做什么,需要重新绑定才能看到控件。您正在进行重新绑定时,您在页面生命周期中 时遇到的问题。
在回发期间,您需要在OnInit页面事件期间重新绑定动态添加的控件。这将允许恢复ViewState。