【问题标题】:ReportViewer resets parameters after submitReportViewer 提交后重置参数
【发布时间】:2013-01-30 15:46:03
【问题描述】:

我在ReportViewer 控件中显示远程报告。报告加载了一些默认参数。到目前为止一切正常。

但是当我更改一些输入值并点击View Report 时,报告只会显示具有默认值的数据。我在输入字段中更改的参数也被重置。

我所有的代码都是这样的:

apsx

<rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana"
    Font-Size="8pt" Height="642px" ProcessingMode="Remote" Width="100%">
    <ServerReport ReportPath="http://server.com/Product/Dashboards/test.rdl" 
        ReportServerUrl="http://server.com/ReportServer" />
</rsweb:ReportViewer>

CodeBehind 基本上是空的。它现在只有一个空的Page_Load

这就是我的全部代码。

但这感觉像是 ViewState 问题?但我不知道去哪里找。

任何人知道为什么当我按下View Report 按钮时参数会重新设置吗?

【问题讨论】:

    标签: asp.net reportviewer reportviewer2008


    【解决方案1】:

    我通过自己在后面的代码中设置参数解决了这个问题。因此,当提交报告时,我会获取所有输入的数据,并将其放入 ReportParameters 集合中。

    但不幸的是,这并不像人们想象的那么简单直接。起初你可能会认为它存储在:YourReport.ServerReport.GetParameters()。但情况不是

    要从您的报告中获取提交的值,您可以使用以下代码:

    获取报告提交参数

    public ReportParameter[] GetCurrentParameters(Microsoft.Reporting.WebForms.ReportViewer viewer)
    {
        Control params1Area = FindParametersArea(viewer);
        List<ReportParameter> params1 = new List<ReportParameter>();
        FindParameters(params1Area, params1);
        return params1.ToArray();
    }
    
    private Control FindParametersArea(Microsoft.Reporting.WebForms.ReportViewer viewer)
    {
        foreach (Control child in viewer.Controls)
        {
            if (child.GetType().Name == "ParametersArea")
                return child;
        }
    
    
        return null;
    }
    
    private void FindParameters(Control parent, List<ReportParameter> params1)
    {
        Type _ParameterControlType = System.Reflection.Assembly.GetAssembly(typeof(Microsoft.Reporting.WebForms.ReportViewer)).GetType("Microsoft.Reporting.WebForms.BaseParameterInputControl");
    
        ReportParameter param;
        Microsoft.Reporting.WebForms.ReportParameterInfo paramInfo;
        String[] paramValues;
        foreach (Control child in parent.Controls)
        {
            if (_ParameterControlType.IsAssignableFrom(child.GetType()))
            {
                paramInfo = (Microsoft.Reporting.WebForms.ReportParameterInfo)GetPropertyValue(child, "ReportParameter");
                if (paramInfo == null)
                    continue;
    
    
                paramValues = (string[])GetPropertyValue(child, "CurrentValue");
                if (paramValues != null && paramValues.Length > 0)
                {
                    param = new ReportParameter();
                    param.Name = paramInfo.Name;
                    param.Values.AddRange(paramValues);
                    params1.Add(param);
                }
            }
            FindParameters(child, params1);
        }
    }
    
    public object GetPropertyValue(object target, string propertyName)
    {
        return target.GetType().GetProperty(propertyName, System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public).GetValue(target, null);
    }
    

    来源:http://forums.asp.net/t/1057747.aspx/1(也是 Visual Basic 示例)

    您只需使用以下代码行即可调用这些方法。例如,最好在 Page_Load 内的 if(IsPostBack) 范围内。

    ReportParameter[] reportParameters = GetCurrentParameters(ReportViewer1);
    

    如果您还有自定义文本字段,则可以覆盖提交的值。您可以像这样轻松地做到这一点:

    reportParameters[4] = new ReportParameter("year", "2013", true);
    

    您显然必须知道索引4 中存储的参数是什么。但是您也可以创建一个简单的查找函数,使用特定名称搜索reportParameter。所以在我的情况下year

    简单的参数查找

    protected void ChangeParameterValue(String name, String newValue, ref ReportParameter[] parameters)
    {
        foreach (ReportParameter param in parameters)
        {
            if (String.Equals(param.Name, name))
            {
                param.Values[0] = newValue;
                break;
            }
        }
    }
    

    你这样使用它:

    ChangeParameterValue("year", "2013", ref reportParameters);
    

    这样你就不用担心index某个参数放在什么位置了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2018-10-05
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多