【问题标题】:How to pass Control object in code behind如何在后面的代码中传递 Control 对象
【发布时间】: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


【解决方案1】:

我会备份并解决“onserverclick”问题。这将触发回发。这很关键,因为它会将您的网络表单和视图状态发布回服务器,以便您可以按照自己的方式与服务器上的这些控件进行交互。

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

这可能是您可以解决的小问题,它使您的点击事件无法触发。一旦你得到修复,其余的就会到位。但是您不能“绕过”它并找到另一种与这些服务器控件交互的方式。一个都没有。

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多