【发布时间】:2016-03-03 12:42:57
【问题描述】:
C#/.Net 4.0,VS2013: 我在一个 aspx 页面中有 3 个选项卡控件(div 标签中的选项卡面板),每个都包含一个 ReportViewer 控件,示例代码如下。我通过 PageMethods 将标签 ID 传递给后面的代码,因为“onserverclick”对我不起作用。我正在根据单击的选项卡获得 tabid。根据 tabid,我在选项卡中填充了相应的报告。
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist" id="reportTabs" runat="server" >
<li role="presentation" id="tab1" class="active" runat="server" ><a href="#tab1" aria-controls="tab1" role="tab" data-toggle="tab" >Tab 1</a></li>
<li role="presentation" id="tab2" runat="server" ><a href="#tab2" aria-controls="tab2" role="tab" data-toggle="tab" >Tab 2</a></li>
<li role="presentation" id="tab2" runat="server"><a href="#tab2" aria-controls="tab3" role="tab" data-toggle="tab" >Tab 3</a></li>
</ul>`
<div role="tabpanel" class="tab-pane" id="rep1" runat="server">
<asp:UpdatePanel>
<ContentTemplate>
<rsweb:ReportViewer ID="rv1" runat="server"
Width="100%" Height="100%"
WaitMessageFont-Size="14pt" PageCountMode="Actual" AsyncRendering="false"
SizeToReportContent="true"
ShowPrintButton="False" >
</rsweb:ReportViewer>
</ContentTemplate>
</asp:UpdatePanel>
</div>
由于 PageMethods 必须是静态方法,我无法将所有方法都转换为静态方法,因此我创建了同一个类的 Singleton 对象。在 Page_Load 中,我将报告 ID 分配给此单例实例的报告 ID。我可以看到 rdlc 报告路径。到目前为止很好。
private static Reports instance = new Reports();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.rv1.LocalReport.ReportPath = "Report1.rdlc";
instance.rv1 = this.rv1;
}
}
在另一种方法中,当我添加 DataSource 时,rv1 变为空。
instance.rv1.LocalReport.DataSources.Add(rds); // rv1 is null.
我做错了什么。任何其他方式来实现这一点。
这是 WebMethod:
public static TabChanged(string liElement)//object sender, EventArgs e)
{
switch (liElement)
{
case "cpContent_tab3":
break;
case "cpContent_tab1":
instance.PopulateRep1();
break;
case "cpContent_tab2":
instance.PopulateRep2();
break;
}
}
protected void PopulateRep1()
{
dt = GetReportDetails();
if (dt != null)
{
ReportDataSource rds = new ReportDataSource("RepSummary", dt);
// instance.rv1.LocalReport.ReportPath = "Rep1.rdlc";
Instance.rv1.LocalReport.DataSources.Clear();
instance.rv1.LocalReport.DataSources.Add(rds);
}
}
感谢任何帮助。
【问题讨论】:
-
WebMethod在哪里? " 'onserverclick' 不适合我" 是什么意思?通常,您不应将控件存储在静态字段中。所有页面对象和控件都在页面生命周期结束时释放。 -
WebMethod 在后面的代码中。而我将'onserverclick'放在'div'下的'li'标签中,但没有触发,因此我求助于WebMethod。调用 WebMethod 只是为了知道单击了哪个选项卡。
标签: .net c#-4.0 webforms code-behind