如何在

时间:2016-03-03 12:42:58

标签: .net c#-4.0 webforms code-behind

C#/。Net 4.0,VS2013: 我在aspx页面中有3个选项卡控件(div标签中的tabpanel),每个控件包含一个ReportViewer控件,下面是示例代码。我将标签ID通过PageMethods传递给后面的代码,因为'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变为null。

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);
        }
    }

感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

我会备份并整理出'onserverclick'问题。这将触发回发。这很关键,因为它会将您的webform和viewstate发布回服务器,以便您可以按照自己的方式与服务器上的那些控件进行交互。

当您执行该回发时,页面的视图状态将被发送回服务器。然后服务器将“知道”页面上控件的状态,然后它就可以操作它们。

这可能是一件很小的事情,你可以解决这个问题,让你的点击事件无法解雇。一旦你得到修复,剩下的就会到位。但你不能“绕过”那个并找到另一种与这些服务器控件交互的方式。没有一个。