コードビハインドでパラメータを自分で設定することでこれを解決しました。したがって、レポートが送信されると、入力されたすべてのデータを取得し、それを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 を明らかに知っておく必要があります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
このようにして、特定のパラメーターがどこに配置されているかを気にする必要はありません。