1

我正在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按钮时参数会重新设置?

4

1 回答 1

4

我通过在后面的代码中自己设置参数解决了这个问题。因此,当提交报告时,我会获取所有输入的数据,并将其放入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 示例)

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

ReportParameter[] reportParameters = GetCurrentParameters(ReportViewer1);

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

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

您显然必须知道什么参数存储在 index 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放置某个参数的位置。

于 2013-01-31T10:32:34.960 回答