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 に格納されている param を明らかに知っておく必要があります4reportParameterしかし、特定の名前でを検索する簡単な検索関数を作成することもできます。だから私の場合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 に答える